服务端:一般服务端首先要将服务打开,在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并没有进行连接所以不用判断是否断开