UDP简单服务器与客户端:
这里用到了
recvfrom()----表示接受来自何处的连接请求信息
sendto()-------要向何处发送
下面这段代码是服务器源码:
下面主要用到:
socket()------创建UDP协议的套接字
bind()-------绑定本机三元信息
recvfrom()-----接收客户端向本机服务器发送来得信息;
sendto()-------向客户端发送消息
1 #include
2 #include
3 #include
4 #include
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
2 #include
3 #include
4 #include
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