您的位置:首页 > 理论基础 > 计算机网络

Linux下的C语言Socket函数建立TCP连接(代码+注释)

2013-06-20 20:10 344 查看
本文介绍利用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐