用Socket編寫TCP程序(C/C++)

此頁由 Linux Wiki用戶Chenxing 於 2008年10月12日 (星期日) 07:42 的最後更改。

出自Linux Wiki

提示:此文已超过 15 年(5647 天)未更新,如发现内容过时或有误,欢迎改进:)

本文介紹利用Linux下的C語言Socket函數建立TCP連接,兼容C++。

利用TCP連接,可以進行HTTP、FTP等常見協議的信息傳輸,是Linux網絡編程的重要部分。

目錄

需要引用的頭文件

進行網絡編程,通常需要引用如下頭文件

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
 
//以下头文件是为了使样例程序正常运行
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

客戶端程序

struct sockaddr_in pin;
struct hostent *nlp_host;
int sd; 
char host_name[256];
int port;
 
//初始化主机名和端口。主机名可以是IP,也可以是可被解析的名称
strcpy(host_name,"www.linux-wiki.cn");
port=80;
 
//解析域名,如果是IP则不用解析,如果出错,显示错误信息
while ((nlp_host=gethostbyname(host_name))==0){
    printf("Resolve Error!\n");
}
 
 
//设置pin变量,包括协议、地址、端口等,此段可直接复制到自己的程序中
bzero(&pin,sizeof(pin));
pin.sin_family=AF_INET;                 //AF_INET表示使用IPv4
pin.sin_addr.s_addr=htonl(INADDR_ANY);  
pin.sin_addr.s_addr=((struct in_addr *)(nlp_host->h_addr))->s_addr;
pin.sin_port=htons(port);
 
//建立socket
sd=socket(AF_INET,SOCK_STREAM,0);
 
//建立连接
while (connect(sd,(struct sockaddr*)&pin,sizeof(pin))==-1){
  printf("Connect Error!\n");
}

至此,與服務器端的連接已建立,通信方法見最後一部分。

服務器端程序

本段是C++代碼。

int serverSocket;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
 
// 用port保存使用的端口
int port=8000;
 
// 建立Socket,并设置
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
 
// 设置socket选项,这是可选的,可以避免服务器程序结束后无法快速重新运行
int val=1;
setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
 
// 定义端口和监听的地址
serverAddr.sin_family      = AF_INET;
serverAddr.sin_port        = htons(port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&(serverAddr.sin_zero), 0, 8);
int rc = bind(serverSocket, (struct sockaddr*) &serverAddr,
		 sizeof(struct sockaddr));
if (rc == -1) {
	printf("Bad bind\n");
	exit(1);
}
 
// 让serverSocket开始监听,客户队列长为5
rc = listen(serverSocket, 5);
if (rc == -1) {
	printf("Bad listen\n");
	exit(1);
}
 
// 等待客户连接
int sock;
int clientAddrSize = sizeof(struct sockaddr_in);
sock = accept(serverSocket,
			(struct sockaddr*) &clientAddr,
			(socklen_t*) &clientAddrSize);

這樣,連接就已建立,返回的sock就是一個新的socket,可以用來通信。


通信方法

發送信息

send(int sd,char * data,int len,0);

其中sd是socket變量名(文件描述符),data是數據緩衝區的地址,len是緩衝區的大小,0通常無需更改

接收信息

recv(int sd,char * buf,int maxlen,0);

關閉連接

close(int sd);

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
简体繁体转换