代码
server.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <arpa/inet.h> 5 #include <sys/socket.h> 6 #include <netinet/ip.h> 7 #include <netinet/in.h> 8 #define BUFLEN 256 // max length of buffer 9 #define PORT 1234 // fixed server port number 10 char line[BUFLEN]; 11 struct sockaddr_in me, client; 12 int sock, rlen, clen = sizeof(client); 13 int main() 14 { 15 printf("1. create a UDP socket\n"); 16 sock = socket(AF_INET , SOCK_DGRAM, IPPROTO_UDP); 17 printf("2. fill me with server address and port number\n"); 18 memset((char *)&me, 0, sizeof(me)); 19 me.sin_family = AF_INET; 20 me.sin_port = htons(PORT); 21 me.sin_addr.s_addr = htonl(INADDR_ANY); // use localhost 22 printf("3. bind socket to server IP and port\n"); 23 bind(sock, (struct sockaddr*)&me, sizeof(me)); 24 printf("4. wait for datagram\n"); 25 while(1){ 26 memset(line, 0, BUFLEN); 27 printf("UDP server: waiting for datagram\n"); 28 // recvfrom() gets client IP, port in sockaddr_in clinet 29 rlen=recvfrom(sock,line,BUFLEN,0,(struct sockaddr *)&client,&clen); 30 printf("received a datagram from [host:port] = [%s:%d]\n", 31 inet_ntoa(client.sin_addr), ntohs(client.sin_port)); 32 printf("rlen=%d: line=%s\n", rlen, line); 33 printf("send reply\n"); 34 sendto(sock, line, rlen, 0, (struct sockaddr*)&client, clen); 35 } 36 }
client.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<sys/socket.h> 5 #include <netinet/ip.h> 6 #include <arpa/inet.h> 7 #define SERVER_HOST "127.0.0.1" // default server IP: localhost 8 #define SERVER_PORT 1234 // fixed server port number 9 #define BUFLEN 256 // max length of buffer 10 char line[BUFLEN]; 11 struct sockaddr_in server; 12 int sock, rlen, slen=sizeof(server); 13 int main(){ 14 printf("1. create a UDP socket\n"); 15 sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 16 printf("2. fill in server address and port number\n"); 17 memset((char *) &server, 0, sizeof(server)); 18 server.sin_family = AF_INET; 19 server.sin_port = htons(SERVER_PORT); 20 inet_aton(SERVER_HOST, &server.sin_addr); 21 while(1){ 22 printf("Enter a line : "); 23 fgets(line, BUFLEN, stdin); 24 line[strlen(line)-1] = 0; 25 printf("send line to server\n"); 26 sendto(sock,line,strlen(line),0,(struct sockaddr *)&server,slen); 27 memset(line, 0, BUFLEN); 28 printf("try to receive a line from server\n"); 29 rlen=recvfrom(sock,line,BUFLEN,0, 30 (struct sockaddr*)&server,&slen); 31 printf("rlen=%d: line=%s\n", rlen, line); 32 } 33 }
运行结果截图
server.c代码中的宏定义
#define BUFLEN 256 // 缓冲区最大长度 #define PORT 1234 // 固定服务器端口
client.c代码中的宏定义
#define SERVER_HOST "127.0.0.1" // 默认服务器IP地址 #define SERVER_PORT 1234 // 默认服务器端口号 #define BUFLEN 256 // 缓冲区最大长度