当前位置:   article > 正文

搭建UDP服务器,客户端

udp服务器

服务器

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include <sys/socket.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #define ERR_MSG(msg) do{\
  9. fprintf(stderr, "__%d__:", __LINE__);\
  10. perror(msg);\
  11. }while(0)
  12. #define PORT 8888
  13. #define IP "192.168.31.212"
  14. int main(int argc, const char *argv[])
  15. {
  16. //创建报式套接字
  17. int sfd = socket(AF_INET, SOCK_DGRAM, 0);
  18. if(sfd < 0)
  19. {
  20. ERR_MSG("socket");
  21. return -1;
  22. }
  23. //填充地址信息结构体,真是的地址信息结构体根据地址族制定
  24. //AF_INET : man 7 ip
  25. struct sockaddr_in sin;
  26. sin.sin_family = AF_INET; //必须填AF_INET;
  27. sin.sin_port = htons(PORT); //端口号的网络字节序;1024~49151
  28. sin.sin_addr.s_addr = inet_addr(IP); //本机IP,ifconfig查看;
  29. //绑定服务器的地址信息结构体到套接字文件描述符上,必须绑定
  30. if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
  31. {
  32. ERR_MSG("bind");
  33. return -1;
  34. }
  35. printf("bind success\n");
  36. ssize_t res = 0;
  37. char buf[128] = "";
  38. struct sockaddr_in cin; //存储数据包的来源
  39. socklen_t addrlen = sizeof(cin);
  40. while(1)
  41. {
  42. bzero(buf, sizeof(buf));
  43. //接收, 接收信息的同时,接收该数据包从谁哪里来
  44. res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);
  45. if(res < 0)
  46. {
  47. ERR_MSG("recvfrom");
  48. return -1;
  49. }
  50. printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
  51. //发送:谁给我发信息,我就将信息发还给谁
  52. strcat(buf, "*_*");
  53. if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin)) < 0)
  54. {
  55. ERR_MSG("sendto");
  56. return -1;
  57. }
  58. printf("sendto success\n");
  59. }
  60. //关闭文件描述符
  61. close(sfd);
  62. return 0;
  63. }

客户端

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include <sys/socket.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #define ERR_MSG(msg) do{\
  9. fprintf(stderr, "__%d__:", __LINE__);\
  10. perror(msg);\
  11. }while(0)
  12. #define CLI_PORT 6666
  13. #define CLI_IP "192.168.31.212"
  14. #define SER_PORT 8888
  15. #define SER_IP "192.168.31.212"
  16. int main(int argc, const char *argv[])
  17. {
  18. //创建报式套接字
  19. int sfd = socket(AF_INET, SOCK_DGRAM, 0);
  20. if(sfd < 0)
  21. {
  22. ERR_MSG("socket");
  23. return -1;
  24. }
  25. //填充服务器地址信息结构体,真是的地址信息结构体根据地址族制定
  26. //AF_INET : man 7 ip,
  27. //由于下面的sendto要发送给服务器,所以需要先填充服务器的地址信息结构体
  28. //供给下面的sendto函数使用;
  29. struct sockaddr_in sin;
  30. sin.sin_family = AF_INET; //必须填AF_INET;
  31. sin.sin_port = htons(SER_PORT); //服务器的端口
  32. sin.sin_addr.s_addr = inet_addr(SER_IP); //服务器IP
  33. ssize_t res = 0;
  34. char buf[128] = "";
  35. struct sockaddr_in rcvaddr; //存储数据包的来源
  36. socklen_t addrlen = sizeof(rcvaddr);
  37. while(1)
  38. {
  39. bzero(buf, sizeof(buf));
  40. //发送,数据给服务器
  41. printf("请输入>>>");
  42. fgets(buf, sizeof(buf), stdin);
  43. buf[strlen(buf)-1] = 0;
  44. if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
  45. {
  46. ERR_MSG("sendto");
  47. return -1;
  48. }
  49. printf("sendto success\n");
  50. //接收, 接收信息的同时,接收该数据包从谁哪里来
  51. res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);
  52. if(res < 0)
  53. {
  54. ERR_MSG("recvfrom");
  55. return -1;
  56. }
  57. printf("[%s:%d] : %s\n", inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);
  58. }
  59. //关闭文件描述符
  60. close(sfd);
  61. return 0;
  62. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号