UDP简单服务器

来源:互联网 发布:我的世界java官方版 编辑:程序博客网 时间:2024/06/07 01:38

 UDP简单服务器与客户端:


这里用到了
recvfrom()----表示接受来自何处的连接请求信息
sendto()-------要向何处发送






下面这段代码是服务器源码:
下面主要用到:
socket()------创建UDP协议的套接字
bind()-------绑定本机三元信息
recvfrom()-----接收客户端向本机服务器发送来得信息;
sendto()-------向客户端发送消息
1 #include <stdio.h>
  2 #include <sys/types.h>          /* See NOTES */
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 
  6 #define PORTS 8765
  7 
  8 #ifdef MYDBG
  9 #define TRACE() printf("%s:%s:%d\n", __func__, __FILE__, __LINE__)
 10 #else
 11 #define TRACE()
 12 #endif
 13 
 14 int myaccpet(int s, struct sockaddr_in *addr, socklen_t *len)
 15 {
 16 
 17 ////这里定义buf的长度
 18 #define MAX 64
 19         char buf[MAX]="";
 20 
 21 /////接受来自请求端(客户端)发来的数据(这里没有使用链接套接子),也就是说>    ,直接使用指定ip,和端口,然后直接发送数据;

第一个参数:是本机的套接字;

第二个参数:要接受的空间的首地址;

第三个参数:能够接收的最大字节数;

第四个参数:(这里不晓得);
第五个参数:用于存放请求端的三元信息;


这个三元结
    构的大小
 22         ssize_t num = recvfrom(s, buf, MAX, 0, (struct sockaddr *)addr, len)    ;
 23         if(0 > num){
 24                 return -1;
 25         }
 26 
 27 
 28 ///////这里打印请求端的地址,以及请求端开放的端口
 29         printf("CON: %s:%u\n", inet_ntoa(addr->sin_addr), ntohs(addr->sin_po    rt));
 30 
 31         return 0;
 32 }
 33 
 34 int main()
 35 {
36 
 37         ////创建套接字,第一个参数:地址族;第二个参数:数据报;第三个参数:总是0
 38         int s = socket(AF_INET, SOCK_DGRAM, 0);
 39         if(0 > s){
 40                 perror("socket");
 41                 return -1;
 42         }
 43 
 44         struct sockaddr_in my_addr;
 45         memset(&my_addr, 0, sizeof(struct sockaddr));
 46         my_addr.sin_family = PF_INET;
 47         my_addr.sin_port   = htons(PORTS);  ////将本地主机字节序转


换为网络的字节序
 48         my_addr.sin_addr.s_addr =inet_addr("127.0.0.1");//INADDR_ANY;

////由本地网卡的ip决定(这里可以修改的)
 49 
 50         int addrlen = sizeof(struct sockaddr);
 51 
 52 ////这里绑定套接字与本机信息
 53         if(0 > bind(s, (struct sockaddr*)&my_addr, addrlen)){
 54                 perror("bind");
 55                 return -1;
 56         }
 57 
 58         while(1){
 59                 struct sockaddr_in addr;
 60                 socklen_t len = sizeof(struct sockaddr_in);
 61                 TRACE();
 62 ////////这里用了一个自定义的函数myaccpet();用该函数内封装实现队客户端的请求>    应答;第一个参数:本机套接字(该套接字被绑定了本机的三元信
息):第二个参数:是用于存放请求客户端的三元信息;第三个信息:这个结构体的长度;
 63                 if(0 > myaccpet(s, &addr, &len))
 64                         return 0;
 65 
 66 ///这里打印结果同myaccpet函数中的打印结果是一样的
 67                 printf("CON: %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.    sin_port));
 68 
 69                 while(1){
 70                         char buf[] = "hello world";
 71 
 72 /////这里用于调试用,如果定义来那个宏,就打印当前函数,以及文件名,还用所在>    行数
 73                         TRACE();
 74 
 75 ///////接收到请求端的请求信息后,用sendto()函数来向请求端发送消息;第一个参>    数:当前本机的套接字;第二个参数:要发送的空间的首地址;第三个参数:这个消息 空间的的字节数; 第四个参数:();第五个参数:办好请求三元信息的结
构体;第六个参数:这个结构提的长度
 76                         sendto(s, buf, sizeof(buf), 0, (struct sockaddr*)&addr, len);
 77                         TRACE();
 78                         sleep(1);
 79                 }
 80         }
 81 
 82 }
 83 




下面是客户端:
类似对比tcp的客户端:
 1 #include <stdio.h>
  2 #include <sys/types.h>          /* See NOTES */
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 
  6 #define PORTS 8765
  7 
  8 #ifdef MYDBG
  9 #define TRACE() printf("%s:%s:%d\n", __func__, __FILE__, __LINE__)
 10 #else
 11 #define TRACE()
 12 #endif
 13 
 14 int myconnect(int s, struct sockaddr_in *addr, socklen_t len)
 15 {
 16         char buf[]="ACK";
 17 
 18 //////下面用到来sendto();该函数的功能是向指定的服务端发送请求信息


;第一个参
    数:本机的套接字(进程级资源);第二个参数:要发送的消息内存空间的


首地址;第
    三个参数:这个地址空间的大小(要发送的消息的地址空间);第四个参数


:();第
    五个参数:包含服务端的的三元信息的结构体首地址;第六个参数:这个结


构体的长度
 19 ;返回值:成功不为-1;否则为-1;
 20         ssize_t num = sendto(s, buf, sizeof(buf), 0, (struct 


sockaddr *)addr    , len);
 21         if(0 > num){
 22                 return -1;
 23         }
 24 
 25 //////用于打印服务端的信息
 26         printf("CON: %s:%u\n", inet_ntoa(addr->sin_addr), ntohs


(addr->sin_po    rt));
 27 
 28         return 0;
 29 }
 30 
 31 int main()
 32 {
 33         int s = socket(AF_INET, SOCK_DGRAM, 0);
 34         if(0 > s){
 35                 perror("socket");
 36                 return -1;
 37         }
 38 
 39         struct sockaddr_in my_addr;
 40         memset(&my_addr, 0, sizeof(struct sockaddr));


 41 ///初始划三元结构体,该结构体包含要访问的服务器的三元信息
 42         my_addr.sin_family = PF_INET;
 43         my_addr.sin_port   = htons(PORTS);
 44         my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 45         int addrlen = sizeof(struct sockaddr);
 46 
 47         TRACE();
 48 /////下面调用myconnect();这个函数来实现向服务端发送信息;
 49         if(0 > myconnect(s, &my_addr, addrlen))
 50                 return -1;
 51 
 52         while(1){
 53                 #define MAX 64
 54                 char buf[MAX];
 55                 bzero(buf, MAX);
 56 
 57                 struct sockaddr_in addr;
 58                 int len = 0;
 59                 TRACE();
 60 
 61 /////这里用于接受服务端回馈“我的”请求信息;该函数在server.c中用解



 62                 int num = recvfrom(s, buf, MAX, 0, (struct sockaddr 


*)&addr,     &len);
 63                 //////打印出服务器回馈的信息
 64                 printf("%d-%s\n", num, buf);
 65         }
 66 }
 67 

原创粉丝点击