当前位置:   article > 正文

Linux中udp服务端,客户端的开发

Linux中udp服务端,客户端的开发

UDP通信相关函数:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

函数说明:接收信息

  • 参数说明:
  • sockfd:套接字
  • buf:要接收的缓冲区
  • len:缓冲区的长度
  • flags:标志位,一般为0
  • src_addr:传出参数,发送方的地址
  • addrlen:发送方地址的长度

返回值:

成功返回读到的子节数

失败返回-1,并设置errno;

 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

函数说明:发送数据

  • sockfd:套接字
  • buf:要发送的缓冲区
  • len:缓冲区的长度
  • flags:标志位,一般为0
  • src_addr:传入参数,接收者的地址
  • addrlen:接收者地址的长度

udp服务端代码:

(相比于tcp服务端,不用liseten,accept)

而且udp服务端可以同时接收多个客户端发来的数据。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include<ctype.h>
  9. int main()
  10. {
  11. int cfd=socket(AF_INET,SOCK_DGRAM,0);
  12. if(cfd<0)
  13. {
  14. perror("socket error");
  15. return -1;
  16. }
  17. struct sockaddr_in serv;//
  18. struct sockaddr_in cli;//定义一个客户端地址,用于接收发来数据的客户端地址
  19. bzero(&serv,sizeof(serv));
  20. bzero(&cli,sizeof(cli));
  21. serv.sin_family=AF_INET;
  22. serv.sin_port=htons(8888);
  23. inet_pton(AF_INET,"192.168.230.130",&serv.sin_addr.s_addr);
  24. bind(cfd,(struct sockaddr*)&serv,sizeof(serv));//绑定
  25. char buf[128];
  26. int n;
  27. int i=0;
  28. socklen_t len;
  29. while(1)
  30. {
  31. len=sizeof(cli);
  32. memset(buf,0x00,sizeof(buf));
  33. n=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);//接收数据,并说的发送方的地址,端口
  34. printf("port==[%d],n==[%d],buf==[%s]\n",ntohs(cli.sin_port),n,buf);
  35. for(i=0;i<n;i++)
  36. {
  37. buf[i]=toupper(buf[i]);
  38. }
  39. sendto(cfd,buf,n,0,(struct sockaddr*)&cli,sizeof(cli));//发送数据
  40. }
  41. close(cfd);
  42. return 0;
  43. }

我们可以使用 nc -u 命令进行检测;

udp客户端代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<arpa/inet.h>
  7. #include <netinet/in.h>
  8. int main()
  9. {
  10. int cfd=socket(AF_INET,SOCK_DGRAM,0);
  11. if(cfd<0)
  12. {
  13. perror("socket error");
  14. return 0;
  15. }
  16. char buf[128];
  17. struct sockaddr_in ser;
  18. bzero(&ser,sizeof(ser));
  19. ser. sin_family=AF_INET;
  20. ser.sin_port=htons(8888);
  21. inet_pton(AF_INET,"192.168.230.130",&ser.sin_addr.s_addr);
  22. int n;
  23. while(1)
  24. {
  25. memset(buf,0x00,sizeof(buf));
  26. n= read(STDIN_FILENO,buf,sizeof(buf));//从标准输入读数据
  27. sendto(cfd,buf,n,0,(struct sockaddr *)&ser,sizeof(ser));//向此地址发送数据
  28. memset(buf,0x00,sizeof(buf));
  29. n=recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);//不关心谁发的读数据,可以设为NULL
  30. printf("n==[%d],buf==[%s]\n",n,buf);
  31. }
  32. close(cfd);
  33. return 0;
  34. }

服务端结果:

客户端结果:

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

闽ICP备14008679号