《UDP用到的大多数函数在上一片TCP中已讲解,这儿就不再重复了,只有接受和发送所用的函数不同》
函数
(1)接受——recvfrom()
(2)发送——sendto()
a. 参数
sockfd: 表示一个已经建立的socket编号(描述符);
buf: 接受数据的缓冲区;
len: 缓冲区的大小;
flags: 调用操作方式,当设为0时,表示用阻塞方式接收;
src_addr: 发送方网络地址信息,指向装有发送方地址的缓存区;
addrlen: 指向src_addr缓存区长度值;
b. 返回值
成功返回读入/发送的字节数,失败返回-1。
2. 程序实现图
3. 程序实现
//udp_server.c
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<netinet/in.h>
5 #include<sys/types.h>
6 #include<sys/socket.h>
7
8 void usage(const char* argv)
9 {
10 printf("%s [ip] [port]\n",argv);
11 exit(0);
12 }
13 static int startup(int ip,int port)
14 {
15 //
16 int sock=socket(AF_INET,SOCK_DGRAM,0);
17 if(sock<0)
18 {
19 perror("socket");
20 exit(1);
21 }
22 //
23 struct sockaddr_in local;
24 local.sin_family=AF_INET;
25 local.sin_port=htons(port);
26 local.sin_addr.s_addr=ip;
27 //
28 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)
29 {
30 perror("bind");
31 exit(2);
32 }
33 return sock;
34 }
35 int main(int argc,char* argv[])
36 {
37 if(argc!=3)
38 {
39 usage(argv[0]);
40 exit(3);
41 }
42 int r_ip=inet_addr(argv[1]);
43 int r_port=atoi(argv[2]);
44
45 int server_sock=startup(r_ip,r_port);
46 if(server_sock<0)
47 {
48 perror("startup");
49 exit(4);
50 }
51
52 char buf[1024];
53 struct sockaddr_in client;
54 socklen_t len =sizeof(client);
55 while(1)
56 {
57 memset(buf,‘\0‘,sizeof(buf));
58 ssize_t size = recvfrom(server_sock,buf,sizeof(buf)-1,0,(struct sock addr*)&client,&len);
59 if(size<0)
60 {
61 perror("recvform");
62 exit(1);
63 }
64 printf("client [%s] [%d]# %s\n",inet_ntoa(client.sin_addr),ntohs(cli ent.sin_port),buf);
65 }
66 return 0;
67 }
//udp_client.c
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<netinet/in.h>
5 #include<sys/types.h>
6 #include<sys/socket.h>
7 void usage(const char* argv)
8 {
9 printf("%s [ip] [port]\n",argv);
10 return ;
11 }
12 int main(int argc,char* argv[])
13 {
14 if(argc!=3)
15 {
16 usage(argv[0]);
17 exit(1);
18
19 }
20
21 char* r_ip=argv[1];
22 int r_port=atoi(argv[2]);
23
24 int sock=socket(AF_INET,SOCK_DGRAM,0);
25 if(sock<0)
26 {
27 perror("socket");
28 exit(2);
29 }
30
31 struct sockaddr_in remote;
32 remote.sin_family=AF_INET;
33 remote.sin_port=htons(r_port);
34 remote.sin_addr.s_addr=inet_addr(r_ip);
35
36 char buf[1024];
37 while(1)
38 {
39 memset(buf,‘\0‘,sizeof(buf));
40 printf("client: ");
41 fflush(stdout);
42 gets(buf);
43 ssize_t _s=sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&remote,sizeof(remote));
44 if(_s<0)
45 {
46 perror("sendto");
47 exit(3);
48 }
49 }
50 return 0;
51 }
//start.sh
1 #!/bin/bash
2
3 ./udp_server 192.168.163.128 8080
//makefile
1 .PHONY:all
2 all:udp_client udp_server
3 udp_client:udp_client.c
4 gcc -o $@ $^
5 udp_server:udp_server.c
6 gcc -o $@ $^
7 .PHONY:clean
8 clean:
9 rm -f udp_client udp_server输出结果:
udp_server.c:
udp_client.c:
本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1782321
原文地址:http://10707460.blog.51cto.com/10697460/1782321