基于UDP套接字编程实例
data.h
1 #ifndef DATA_H 2 #define DATA_H 3 #include <stdio.h> 4 #include <string.h> 5 #include <sys/types.h> 6 #include <sys/stat.h> 7 #include <sys/socket.h> 8 #include <stdlib.h> 9 #include <unistd.h> 10 #include <netinet/in.h> 11 #include <arpa/inet.h> 12 #include <netdb.h> 13 #include <errno.h> 14 #define PORT 4578 15 #define maxn 100 16 17 #endif
server.c
1 #include "data.h" 2 int main() 3 { 4 int sockfd; 5 struct sockaddr_in server; 6 struct sockaddr_in client; 7 socklen_t len; 8 int num; 9 char buf[maxn]; 10 if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1) 11 { 12 fprintf(stderr,"socket fail,error:%s\n",strerror(errno)); 13 return -1; 14 } 15 bzero(&server,sizeof(server)); 16 server.sin_family = AF_INET; 17 server.sin_port = htons(PORT); 18 server.sin_addr.s_addr = htonl(INADDR_ANY); 19 if(bind(sockfd,(struct sockaddr*)&server,sizeof(server)) == -1) 20 { 21 fprintf(stderr,"bind fail,error:%s\n",strerror(errno)); 22 return -1; 23 } 24 len = sizeof(client); 25 bzero(&buf,sizeof(buf)); 26 while(1) 27 { 28 num = recvfrom(sockfd,buf,maxn,0,(struct sockaddr*)&client,&len); 29 if(num < 0) 30 { 31 perror("recvfrom() error!\n"); 32 exit(1); 33 } 34 num--; 35 buf[num] = '\0'; 36 printf("You got a message <%s> from client.\n",buf); 37 printf("It is ip is %s,port is %d.\n", 38 inet_ntoa(client.sin_addr), htons(client.sin_port)); 39 sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&client,len); 40 if(!strcmp(buf,"bye")) 41 break; 42 } 43 close(sockfd); 44 45 }
client.c
#include "data.h" int main() { int sockfd,num; char sendbuf[maxn]; char recvbuf[maxn]; struct sockaddr_in server; struct sockaddr_in peer; if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1) { fprintf(stderr,"socket fail,error %s\n",strerror(errno)); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&sendbuf,sizeof(sendbuf)); bzero(&recvbuf,sizeof(recvbuf)); while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL) { int tt = strlen(sendbuf); sendto(sockfd,sendbuf,tt,0,(struct sockaddr*)&server,sizeof(server)); socklen_t len; recvfrom(sockfd,recvbuf,maxn,0,NULL,NULL); printf("receive message is :"); fputs(recvbuf,stdout); printf("\n"); bzero(&sendbuf,sizeof(sendbuf)); bzero(&recvbuf,sizeof(recvbuf)); } close(sockfd); return 0; }
运行结果: