Linux网络编程的一般步骤

服务端:一般服务端首先要将服务打开,在Linux中,网络服务的创建步骤基本上差不多.基本上这些代码都是可以通用的.

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netdb.h>

static int create_server(short port)
{
int sockfd;  //网络监听套接字
struct sockaddr_in self;  //网络信息的结构体
int ret;  //接收返回值判断函数知否出错


/*创建网络套接字,参数:AF_INET表示IPv4,指定地址协议类型.SOCK_STREAM表示TCP协议,指定传输协议,也可以是UDP,原始网络传输协议等,0表示传输协议编号,通常默认为0,而且通常不用管*/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){//返回值-1为出错
perror("socket");
return -1;
}

memset(&self,0,sizeof(self));//将网络信息的接收体初始化
self.sin_family = AF_INET;//网络信息结构体中的网络地址协议信息
self.sin_port = htons(port);//网络信息结构体中的端口信息
self.sin_addr.s_addr = htonl(INADDR_ANY);//网络信息结构体中的IP地址的信息,INADDR_ANY表示采用本机已经获得的IP地址

/*将IP和网络套接字进行绑定,参数:sockfd,网络套接字,第二个参数为网络信息的结构体转网络地址结构体,该参数为指针,第三个参数为指针指向的长度*/
ret = bind(sockfd,(struct sockaddr *)&self,sizeof(self));
if(ret == -1){//返回值为-1则出错
perror("bind");
return -1;
}

listen(sockfd,5);//对该网络套接字进行监听,第二个参数为可监听的最大连接数
printf("listen... ");

return sockfd;
}

listen_fd = create_server(80);//返回网络监听套接字

sock_fd = accept(listen_fd , (struct sockaddr *)&client , &len);//等待客户端连接,没有客户端连接的话进入阻塞状态

客户端:

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd){
perror("socket");
exit(-1);
}

memset(&dest,0,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(port);
inet_aton(argv[1],&dest.sin_addr);
//如果是UDP协议该Connect函数不用写,直接使用socket发送数据
ret = connect(sockfd,(struct sockaddr *)&dest, sizeof(dest));

接收和发送数据:

TCP:

发送函数:

int send(int s,const void *mes,int len,unsigned int falgs);

参数:第一个:已经连接成功的套接字

第二个:要发送的内容的指针

第三个:指针指向内容的长度

第四个:发送的选项,默认为0

返回值-1出错,成功返回发送成功的字节数

接收函数:

int recv(int s,void *buf,int len,unsigned int flags);

参数:第一个已经连接成功的套接字

第二个:要发送的数据的指针

第三个:要发送的数据的指针的长度

第四个:接收的选项,默认为0

返回值-1出错,成功返回发送接收的字节数,0为对方断开连接

UDP:

发送函数:

int sendto(int s,const void *mes,int len,unsigned int flags,const sockaddr * to,int to len);

参数:第一个:套接字

第二个:要发送的内容的指针

第三个:指针指向内容的长度

第四个:对方主机的地址信息的指针

第五个:对方主机的地址信息的指针的长度

返回值:-1出错,成功返回成功发送的字节数

接收函数:

int recvfrom(int s,void *buf,int len ,unsigned int flags,struct sockaddr *from,int *fromlen);

参数:第一个已经连接成功的套接字

第二个:要发送的数据的指针

第三个:要发送的数据的指针的长度

第四个:对方主机的地址信息的指针

第五个:对方主机的地址信息的指针的长度

返回值:-1出错,成功返回成功接收的字节数,因为UDP并没有进行连接所以不用判断是否断开

原文地址:https://www.cnblogs.com/CHYI1/p/5490103.html