设为首页 加入收藏

TOP

Linux下的C语言Socket函数建立TCP连接
2014-11-24 02:22:38 来源: 作者: 【 】 浏览:1
Tags:Linux 语言 Socket 函数 建立 TCP 连接

本文介绍利用Linux下的C语言Socket函数建立TCP连接,兼容C++


利用TCP连接,可以进行HTTP、FTP等常见协议的信息传输,是Linux网络编程的重要部分。


需要引用的头文件
进行网络编程,通常需要引用如下头文件


#include
#include
#include
#include
#include
#include

//以下头文件是为了使样例程序正常运行
#include
#include
#include


客户端程序


struct sockaddr_in pin;
struct hostent *nlp_host;
int sd;
char host_name[256];
int port;

//初始化主机名和端口。主机名可以是IP,也可以是可被解析的名称
strcpy(host_name,"www.avnads.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);


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Virtualbox运行自编译的Linux 下一篇JAVA需要注意的函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: