现在的位置: 首页 > 综合 > 正文

UNIX UDP回射服务器/客户端

2012年07月27日 ⁄ 综合 ⁄ 共 2444字 ⁄ 字号 评论关闭

    《Unix网络编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。

    PS:程序里使用了包裹函数(首字母是大写的函数)和常量(所有字母都是大写的常量)的声明在my_unp.h文件中,定义在unp_base.c和unp_thread.c中,地址:http://blog.csdn.net/aaa20090987/article/details/8096701

程序简介:这一对例子演示了服务器和客户端使用UDP协议传输数据的基本原理和流程。


服务器端:

  1. #include "my_unp.h"  
  2.   
  3. void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)  
  4. {  
  5.     int n;  
  6.     socklen_t len;  
  7.     char mesg[MAXLINE];  
  8.   
  9.     //每当一个数据报到达时,先接收数据,然后再把数据返回给客户端  
  10.     while( 1 )  
  11.     {  
  12.         len = clilen;  
  13.         n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);  
  14.         Sendto(sockfd, mesg, n, 0, pcliaddr, len);  
  15.     }  
  16. }  
  17.   
  18. int main(int argc, char **argv)  
  19. {  
  20.     int sockfd;  
  21.     struct sockaddr_in  servaddr, cliaddr;  
  22.   
  23.     //建立一个基于IPv4数据报(udp)的套接字  
  24.     sockfd = Socket(AF_INET, SOCK_DGRAM, 0);  
  25.     memset(&servaddr, 0, sizeof(servaddr));  
  26.     servaddr.sin_family = AF_INET;  
  27.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  28.     servaddr.sin_port = htons(SERV_PORT);  
  29.     //把socket和socket地址结构联系起来  
  30.     Bind(sockfd, (SA *) &servaddr, sizeof(servaddr));  
  31.   
  32.     dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));  
  33.   
  34.     return 0;  
  35. }  


客户端:

  1. #include "my_unp.h"  
  2.   
  3. void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)  
  4. {  
  5.     int n;  
  6.     char sendline[MAXLINE], recvline[MAXLINE + 1];  
  7.   
  8.     //从终端获取一行字符串,将其写入套接字    
  9.     //然后从套接字一行字符串,将其写入终端    
  10.     while (Fgets(sendline, MAXLINE, fp) != NULL)  
  11.     {  
  12.         Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);  
  13.         n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);  
  14.         recvline[n] = 0;  
  15.         Fputs(recvline, stdout);  
  16.     }  
  17. }  
  18.   
  19. int  
  20. main(int argc, char **argv)  
  21. {  
  22.     int  sockfd;  
  23.     struct sockaddr_in  servaddr;  
  24.   
  25.     if (argc != 2)  
  26.         error_quit("usage: udpcli <IPaddress>");  
  27.   
  28.     //创建用于TCP协议的套接字   
  29.     sockfd = Socket(AF_INET, SOCK_DGRAM, 0);  
  30.     memset(&servaddr, 0, sizeof(servaddr));  
  31.     servaddr.sin_family = AF_INET;  
  32.     servaddr.sin_port = htons(SERV_PORT);  
  33.   
  34.     //将程序的参数1(argv[1])转换成套接字地址结构    
  35.     Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);  
  36.     dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));  
  37.   
  38.     return 0;  
  39. }  


运行示例(红色字体的为输入)
服务器端:
qch@ubuntu:~/code$ gcc my_unp.c server.c -o server
qch@ubuntu:~/code$./server
客户端:
qch@ubuntu:~/code$gcc my_unp.c client.c -o client
qch@ubuntu:~/code$./client 127.0.0.1
hello, world
hello, world

抱歉!评论已关闭.