当前位置:   article > 正文

【网络编程】UDP实现网络通信(C语言、Ubuntu实现)

【网络编程】UDP实现网络通信(C语言、Ubuntu实现)


代码实现:分为udpSer.c(服务器端)和udpCli.c(客户端)

  1. //udpSer.c
  2. #include <myhead.h>
  3. #define SER_PORT 9999
  4. #define SER_IP "192.168.83.128"
  5. int main(int argc, const char *argv[])
  6. {
  7. //1、创建用于通信的服务器套接字文件描述符
  8. int sfd = socket(AF_INET,SOCK_DGRAM,0);
  9. if(sfd == -1)
  10. {
  11. perror("socket error");
  12. return -1;
  13. }
  14. printf("sfd = %d\n", sfd); //3
  15. //端口号快速重用
  16. int reuse = 1;
  17. if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
  18. {
  19. perror("setsockopt error");
  20. return -1;
  21. }
  22. printf("端口号快速重用成功\n");
  23. //2、绑定ip地址和端口号
  24. struct sockaddr_in sin;
  25. sin.sin_family = AF_INET;
  26. sin.sin_port = htons(SER_PORT);
  27. sin.sin_addr.s_addr = inet_addr(SER_IP);
  28. //2.2绑定工作
  29. if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) == -1)
  30. {
  31. perror("bind error");
  32. return -1;
  33. }
  34. printf("bind success\n");
  35. //3、数据收发
  36. char buf[128] = "";
  37. struct sockaddr_in cin; //接受对端地址信息
  38. socklen_t addrlen = sizeof(cin);
  39. while(1)
  40. {
  41. //清空容器
  42. bzero(buf,sizeof(buf));
  43. //从套接字中读取数据
  44. recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&addrlen);
  45. printf("收到消息为:%s\n",buf);
  46. strcat(buf,"*+*");
  47. if((sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&cin,sizeof(cin))) == -1)
  48. {
  49. perror("发送 error");
  50. return -1;
  51. }
  52. }
  53. //4、关闭文件描述符
  54. close(sfd);
  55. return 0;
  56. }
  1. //udpCli.c
  2. #include <myhead.h>
  3. #define SER_PORT 9999
  4. #define SER_IP "192.168.83.128"
  5. #define CLI_PORT 3333
  6. #define CLI_IP "192.168.83.128"
  7. int main(int argc, const char *argv[])
  8. {
  9. //1、创建用于通信的服务器套接字文件描述符
  10. int cfd = socket(AF_INET,SOCK_DGRAM,0);
  11. if(cfd == -1)
  12. {
  13. perror("socket error");
  14. return -1;
  15. }
  16. printf("cfd = %d\n", cfd); //3
  17. //将端口号快速重用
  18. int reuse = 1;
  19. if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
  20. {
  21. perror("setsockopt error");
  22. return -1;
  23. }
  24. printf("端口号快速重用成功\n");
  25. //2、绑定ip地址和端口号
  26. struct sockaddr_in cin;
  27. cin.sin_family = AF_INET;
  28. cin.sin_port = htons(CLI_PORT);
  29. cin.sin_addr.s_addr = inet_addr(CLI_IP);
  30. //2.2绑定工作
  31. if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin)) == -1)
  32. {
  33. perror("bind error");
  34. return -1;
  35. }
  36. printf("bind success\n");
  37. //3、数据收发
  38. char buf[128] = "";
  39. struct sockaddr_in sin;
  40. sin.sin_family = AF_INET;
  41. sin.sin_port = htons(SER_PORT);
  42. sin.sin_addr.s_addr = inet_addr(SER_IP);
  43. while(1)
  44. {
  45. printf("请输入>>>");
  46. fgets(buf,sizeof(buf),stdin);
  47. buf[strlen(buf) - 1] = 0;
  48. //将数据发送给服务器
  49. sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin));
  50. printf("发送成功\n");
  51. bzero(buf,sizeof(buf));
  52. recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
  53. printf("收到服务器消息为:%s\n",buf);
  54. }
  55. //4、关闭文件描述符
  56. close(cfd);
  57. return 0;
  58. }

输出结果如下:成功从客户端发送信息到服务器中

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/975034
推荐阅读
相关标签
  

闽ICP备14008679号