Linux 网络编程:循环UDP
UDP循环服务器模型
UDP模型服务器端recvfrom() 函数进行接收,用户端sendto()进行发送。
Server端代码:
#include "net.h"
int main()
{
int fp;
struct sockaddr_in myaddr;
// 1. open socket
if((fp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket fail");
exit(0);
}
// 2. set bind()
memset(&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(Netport);
// inet_aton(Netip,(int_addr *)&myaddr.sin_addr.s_addr);
//myaddr.sin_addr.s_addr = inet_addr(Netip);
//优化,使服务器能够接受绑定在任意IP上 INADDR_ANY
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fp,(struct sockaddr*) &myaddr,sizeof(myaddr)) < 0)
{
perror("bind fail");
exit(0);
}
// 3. set recvfrom
int ret = -1;
struct sockaddr_in recv_addr;
socklen_t recv_addr_len = sizeof(recv_addr);
char ipv4_addr[16]={0};
int connect_port = 0;
char buf[BUFSIZ];
bzero(buf,BUFSIZ);
while(1) //接收用户发送信息
{
ret = recvfrom(fp,buf,(BUFSIZ-1),0,(struct sockaddr*)&recv_addr, &recv_addr_len);
if(ret < 0)
{
perror("recvfrom fail");
exit(0);
}
if(NULL == inet_ntop(AF_INET,(void *)&recv_addr.sin_addr, ipv4_addr, sizeof(recv_addr)))
{
perror("inet_ntop");
exit(0);
}
connect_port = ntohs(recv_addr.sin_port);
if(!strncmp(buf,"\n",strlen("\n")))
{
bzero(buf,BUFSIZ);
}
if(!strncmp(buf,QUIT_STR,strlen(QUIT_STR)))
{
printf("(%s:%d) client is exiting! \n", ipv4_addr,connect_port);
bzero(buf,BUFSIZ);
continue;
}
printf("(%s:%d) Receivedata: %s \n",ipv4_addr,connect_port,buf);
//可在此添加服务器处理用户信息。
}
close(fp);
return 0;
}
Client端代码:
#include "net.h"
int main()
{
// 1. set
int fp = -1;
if((fp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket fail");
exit(0);
}
// 2.set sendto
struct sockaddr_in myaddr;
memset(&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(Netport);
//myaddr.sin_addr.s_addr = inet_addr(Netip);
if(inet_pton(AF_INET, Netip, (void *)&myaddr.sin_addr.s_addr) != 1)
{
perror("inet_pton fail");
exit(0);
}
char buf[BUFSIZ];
while(1) //向客户端发送信息
{
bzero(buf, BUFSIZ);
if(NULL == fgets(buf,BUFSIZ,stdin))
{
continue;
}
sendto(fp,buf,strlen(buf),0,(struct sockaddr*)&myaddr,(socklen_t)sizeof(myaddr));
if(!strncmp(buf,QUIT_STR,strlen(QUIT_STR)))
{
printf("Client is exiting !\n");
break;
}
//可在此添加接收客户端返还信息。
}
close(fp);
return 0;
}