|
一.相关过程以及知识请详见我的另一篇博客《winsock套接字编程》,这里不再累述。
二.相关代码:
server.c:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| 1 /****************************************
2 > File Name:server.c
3 > Author:xiaoxiaohui
4 > mail:1924224891@qq.com
5 > Created Time:2016年05月21日 星期六 15时05分23秒
6 ****************************************/
7
8 #include<stdio.h>
9 #include<stdlib.h>
10 #include<sys/types.h>
11 #include<sys/socket.h>
12 #include<unistd.h>
13 #include<arpa/inet.h>
14 #include<netinet/in.h>
15 #include<string.h>
16
17 const int PORT = 9090;
18 const int LEN = 1024;
19 int serverSock;
20 struct sockaddr_in local;
21 struct sockaddr_in client;
22
23
24 int main()
25 {
26 serverSock = socket(AF_INET, SOCK_DGRAM, 0);
27
28 local.sin_family = AF_INET;
29 //local.sin_addr.s_addr = htonl(INADDR_ANY);
30 local.sin_port = htons(PORT);
31 local.sin_addr.s_addr = inet_addr("127.0.0.1");
32 bind(serverSock, (struct sockaddr*)&local, sizeof(local));
33
34 char buf[LEN];
35 while(1)
36 {
37 int ret = 0;
38 socklen_t len = sizeof(client);
39 memset(buf, '\0', LEN);
40 ret = recvfrom(serverSock, buf, LEN - 1, 0, (struct sockaddr*)&client, &len);
41
42 printf("ret is %d", ret);
43 if(ret == 0)
44 {
45 printf("client is closed!\n");
46 exit(2);
47 }
48 else if(ret < 0)
49 {
50 perror("recvfrom");
51 continue;
52 }
53 else
54 {
55 buf[ret] = '\0';
56 printf("client[ip:%s][port:%d]# %s\n", inet_ntoa(client.sin_addr), \
57 ntohs(client.sin_port), buf);
58 fflush(stdout);
59 }
60
61 if(strstr(buf, "quit") != NULL)
62 {
63 close(serverSock);
64 return 0;
65 }
66 }
67 return 0;
68 }
|
client.c:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| 1 /****************************************
2 > File Name:client.c
3 > Author:xiaoxiaohui
4 > mail:1924224891@qq.com
5 > Created Time:2016年05月21日 星期六 15时35分32秒
6 ****************************************/
7
8 #include<stdio.h>
9 #include<sys/types.h>
10 #include<sys/socket.h>
11 #include<unistd.h>
12 #include<arpa/inet.h>
13 #include<netinet/in.h>
14 #include<string.h>
15
16 const int PORT = 9090;
17 const char* IP = "127.0.0.1";
18 //const char* IP = "192.168.0.145";
19 const int LEN = 1024;
20 int clientSock;
21 struct sockaddr_in server;
22
23 int main()
24 {
25
26 clientSock = socket(AF_INET, SOCK_DGRAM, 0);
27
28 server.sin_family = AF_INET;
29 server.sin_addr.s_addr = inet_addr(IP);
30 server.sin_port = htons(PORT);
31
32 char buf[LEN];
33 while(1)
34 {
35 memset(buf, '\0', LEN);
36 printf("please input: ");
37 fflush(stdout);
38 gets(buf);
39
40 int ret = sendto(clientSock, buf, strlen(buf), 0, (struct sockaddr*)&server, sizeof(server));
41 if(ret <= 0)
42 {
43 perror("sendto");
44 continue;
45 }
46
47 if(strcmp(buf, "quit") == 0)
48 {
49 close(clientSock);
50 return 0;
51 }
52 }
53
54 return 0;
55 }
|
Makefile:
1
2
3
4
5
6
7
8
9
10
11
| 1 .PHONY:all
2 all:server client
3
4 server:server.c
5 gcc -o $@ $^ -g
6 client:client.c
7 gcc -o $@ $^ -g
8
9 .PHONY:clean
10 clean:
11 rm -f server client
|
执行结果:
三.总结:
UDP套接字编程是不用建立链接的,所以服务器不用listen和accept,客户端不用connect,recvfrom和sendto中有对方的套接字信息。
UDP因为是面向链接的,所以在传输数据过程中比TCP要高效,适用于流媒体或对可靠性要求不高的应用。
|
|