读书人

UNIX UDP来射服务器/客户端

发布时间: 2013-01-23 10:44:50 作者: rapoo

UNIX UDP回射服务器/客户端

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

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

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


服务器端:

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

客户端:

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

运行示例(红色字体的为输入)
服务器端:
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

读书人网 >UNIXLINUX

热点推荐