分享

(一)UDP基本编程步骤

 薛董_艾瑞 2018-03-20

UDP服务端编程分5步:

1.创建 UDP socket套接字,用socket函数。

2.设置socket的属性,用setsockopt()函数,(可选)

3.往socket绑定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)结构体。用bind()函数

4.循环接收消息,用recvfrom()函数

5.关闭socket套接字


UDP客户端编程分:

1.创建 UDP socket套接字,用socket函数。

2.用sendto()函数往指定的IP,地址发送信息。


UDP的发送函数sendto()和接收函数 recvfrom():

1.sendto():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to , int fromlen);  

第一个参数为服务端的udp监听套接字

第二个参数为发送数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小。

返回值:成功返回实际发送出去的信息的字节数,失败返回-1



2.recvfrom():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);  

第一个参数为服务端的udp监听套接字

第二个参数为接收数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小,取地址。

返回值:成功返回接收到的信息的字节数,失败返回-1


头文件:

  1. #ifndef _MYHEAD_H_  
  2. #define _MYHEAD_H_  
  3.   
  4. #include <sys/types.h>  
  5. #include <sys/stat.h>  
  6. #include <fcntl.h>  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <string.h>  
  10. #include <strings.h>  
  11. #include <unistd.h>  
  12. #include <errno.h>  
  13. #include <sys/stat.h>  
  14. #include <dirent.h>  
  15. #include <sys/mman.h>  
  16. #include <sys/wait.h>  
  17. #include <signal.h>  
  18. #include <sys/ipc.h>  
  19. #include <sys/shm.h>  
  20. #include <sys/msg.h>  
  21. #include <sys/sem.h>  
  22. #include <pthread.h>  
  23. #include <semaphore.h>  
  24. #include <poll.h>  
  25. #include <sys/epoll.h>  
  26. #include <sys/socket.h>  
  27. #include <netinet/in.h>  
  28. #include <arpa/inet.h>  
  29. #include <netinet/in.h>  
  30.   
  31.   
  32. #endif  



服务端:

  1. #include"myhead.h"  
  2. char rbuf[50];  
  3.   
  4. int main()  
  5. {  
  6.     int sockfd;  
  7.     int size;  
  8.     int ret;  
  9.     int on =1;  
  10.     struct sockaddr_in saddr;  
  11.     struct sockaddr_in raddr;  
  12.   
  13.     //设置地址信息,ip信息  
  14.     size = sizeof(struct sockaddr_in);  
  15.     bzero(&saddr,size);  
  16.     saddr.sin_family = AF_INET;  
  17.     saddr.sin_port = htons(8888);  
  18.     saddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  19.   
  20.     //创建udp 的套接字  
  21.     sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  22.     if(sockfd<0)  
  23.     {  
  24.         perror("socket failed");  
  25.         return -1;  
  26.     }  
  27.   
  28.     //设置端口复用  
  29.     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));   
  30.   
  31.     //绑定地址信息,ip信息  
  32.     ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));  
  33.     if(ret<0)  
  34.     {  
  35.         perror("sbind failed");  
  36.         return -1;  
  37.     }  
  38.   
  39.     int val = sizeof(struct sockaddr);  
  40.     //循环接收客户端发来的消息  
  41.     while(1)  
  42.     {  
  43.         puts("waiting data");  
  44.         ret=recvfrom(sockfd,rbuf,50,0,(struct sockaddr*)&raddr,&val);  
  45.         if(ret <0)  
  46.         {  
  47.             perror("recvfrom failed");  
  48.         }  
  49.   
  50.         printf("the data :%s\n",rbuf);  
  51.         bzero(rbuf,50);  
  52.     }  
  53.     //关闭udp套接字,这里不可达的。  
  54.     close(sockfd);  
  55.     return 0;  
  56. }  

客户端:

  1. #include"myhead.h"  
  2. char wbuf[50];  
  3.   
  4. int main()  
  5. {  
  6.     int sockfd;  
  7.     int size,on = 1;  
  8.     struct sockaddr_in saddr;  
  9.     int ret;  
  10.   
  11.     size = sizeof(struct sockaddr_in);  
  12.     bzero(&saddr,size);  
  13.   
  14.     //设置地址信息,ip信息  
  15.     saddr.sin_family = AF_INET;  
  16.     saddr.sin_port = htons(8888);  
  17.     saddr.sin_addr.s_addr = inet_addr("192.168.152.128");//192.168.152.128为服务端所在的ip,由于本代码是本机测试,所以写的是自己的ip  
  18.   
  19.     //创建udp 的套接字  
  20.     sockfd= socket(AF_INET,SOCK_DGRAM,0);  
  21.     if(sockfd<0)  
  22.     {  
  23.         perror("failed socket");  
  24.         return -1;  
  25.     }  
  26.     //设置端口复用  
  27.     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));  
  28.   
  29.     //循环发送信息给服务端  
  30.     while(1)  
  31.     {  
  32.         puts("please enter data:");  
  33.         scanf("%s",wbuf);  
  34.         ret=sendto(sockfd,wbuf,50,0,(struct sockaddr*)&saddr,  
  35.             sizeof(struct sockaddr));  
  36.         if(ret<0)  
  37.         {  
  38.             perror("sendto failed");  
  39.         }  
  40.   
  41.         bzero(wbuf,50);  
  42.     }  
  43.     close(sockfd);  
  44.     return 0;  
  45. }  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多