Linux socket通訊(UDP)
阿新 • • 發佈:2018-12-31
udp服務端
#include<stdio.h> #include <sys/socket.h> #include<string.h> #include <arpa/inet.h> #include <unistd.h> #include <netinet/in.h> #define UDP_PORT 8888 int main() { int socket_ser; char bufrec[1500]; char ipbuf[16]; socket_ser = socket(AF_INET,SOCK_DGRAM,0); struct sockaddr_in addr,addr_c; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(socket_ser,(struct sockaddr *)&addr,sizeof(addr)); while(1) { bzero(bufrec,sizeof(bufrec)); bzero(&ipbuf,sizeof(ipbuf)); socklen_t len = sizeof(addr_c); uint length = recvfrom(socket_ser,bufrec, sizeof(bufrec),0,(struct sockaddr*)&addr_c,&len); inet_ntop(AF_INET,&addr_c.sin_addr.s_addr,ipbuf,sizeof(ipbuf)); printf("Ip is %s,port is %d\n",ipbuf,ntohs(addr_c.sin_port)); printf("%s\n",bufrec); sendto(socket_ser,bufrec,strlen(bufrec),0,(struct sockaddr*)&addr_c,sizeof(addr_c)); } close(socket_ser); return 0; }
UDP無需三次握手四次揮手,因此沒必要使用list去維護佇列,accept也不再需要。
客戶端
#include<stdio.h> #include <sys/socket.h> #include<string.h> #include <arpa/inet.h> #include <unistd.h> #include <netinet/in.h> #define UDP_PORT 8888 int main() { int socketcli; char bufsend[] ="hello world"; char bufrec[1500]; char ipbuf[16]; socketcli = socket(AF_INET,SOCK_DGRAM,0); struct sockaddr_in addr; bzero(&addr,sizeof(addr)); bzero(&bufrec,sizeof(bufrec)); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); sendto(socketcli,bufsend,strlen(bufsend),0,(struct sockaddr*)&addr, sizeof(addr)); recvfrom(socketcli,bufrec, sizeof(bufrec),0,NULL,NULL); printf("%s\n",bufrec); return 0; }
客戶端的recvfrom最後兩個引數是傳回服務端的地址埠等資訊 和長度,由於客戶端本就已經知道因此可以直接設定為NULL