基于UDP的socket编程
2016-06-14 22:16
148 查看
一.相关函数说明
UDP是无连接的,即发送数据之前不需要建立连接。
除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数。
1.sendto函数:用于客户端中指定一目的地发送数据。
(1)函数原型
![](http://s1.51cto.com/wyfs02/M01/82/C2/wKiom1dgDCCDrLECAAB2Hlhps7Y083.png)
(2)参数说明
sockfd:套接字
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞
dest_addr:指向目的套接字的地址
addrlen:指向目的套接字的长度
(3)返回值
![](http://s4.51cto.com/wyfs02/M01/82/C2/wKiom1dgDDXR2PzXAAAf_-FR4BU204.png)
2.recvfrom函数:用于服务器端从套接口上接受数据。
(1)函数原型
![](http://s2.51cto.com/wyfs02/M02/82/C2/wKiom1dgDEfhlMWRAAB7na_e6WA749.png)
(2)参数说明
sockfd:套接字
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞 dest_addr:指向源套接字的地址 addrlen:指向源套接字的长度 (3)返回值
![](http://s5.51cto.com/wyfs02/M02/82/C1/wKioL1dgDXDAT3V4AAAr_Rq3Hds439.png)
二.程序实现
server端:
![](http://s5.51cto.com/wyfs02/M00/82/C1/wKioL1dgEJbhmc1sAABrNo1QJqE772.png)
UDP是无连接的,即发送数据之前不需要建立连接。
除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数。
1.sendto函数:用于客户端中指定一目的地发送数据。
(1)函数原型
![](http://s1.51cto.com/wyfs02/M01/82/C2/wKiom1dgDCCDrLECAAB2Hlhps7Y083.png)
(2)参数说明
sockfd:套接字
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞
dest_addr:指向目的套接字的地址
addrlen:指向目的套接字的长度
(3)返回值
![](http://s4.51cto.com/wyfs02/M01/82/C2/wKiom1dgDDXR2PzXAAAf_-FR4BU204.png)
2.recvfrom函数:用于服务器端从套接口上接受数据。
(1)函数原型
![](http://s2.51cto.com/wyfs02/M02/82/C2/wKiom1dgDEfhlMWRAAB7na_e6WA749.png)
(2)参数说明
sockfd:套接字
buf:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞 dest_addr:指向源套接字的地址 addrlen:指向源套接字的长度 (3)返回值
![](http://s5.51cto.com/wyfs02/M02/82/C1/wKioL1dgDXDAT3V4AAAr_Rq3Hds439.png)
二.程序实现
server端:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<errno.h> 4 #include<string.h> 5 #include<netinet/in.h> 6 #include<arpa/inet.h> 7 #include<sys/types.h> 8 #include<sys/socket.h> 9 10 void usage(char *proc) 11 { 12 printf("%s [ip][port]\n",proc); 13 } 14 15 int main(int argc,char *argv[]) 16 { 17 if(argc!=3) 18 { 19 usage(argv[0]); 20 exit(1); 21 } 22 int sock=socket(AF_INET,SOCK_DGRAM,0); 23 if(sock<0) 24 { 25 perror("socket"); 26 exit(2); 27 } 28 int port=atoi(argv[2]); 29 char *ip=argv[1]; 30 31 struct sockaddr_in local; 32 local.sin_family=AF_INET; 33 local.sin_port=htons(port); 34 local.sin_addr.s_addr=inet_addr(ip); 35 36 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) 37 { 38 perror("bind"); 39 exit(3); 40 } 41 42 char buf[1024]; 43 struct sockaddr_in remote; 44 socklen_t len=sizeof(remote); 45 while(1) 46 { 47 memset(buf,'\0',sizeof(buf)); 48 ssize_t _s=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockadd r*)&remote,&len); 49 char *client_ip=inet_ntoa(remote.sin_addr); 50 int client_port=ntohs(remote.sin_port); 51 if(_s<0) 52 { 53 perror("recvfrom"); 54 break; 55 } 56 else if(_s==0) 57 { 58 printf("client %s close...\n",client_ip); 59 exit(4); 60 } 61 else 62 { 63 printf("client:[ip:%s][port:%d]:%s",client_ip,client _port,buf); 64 } 65 66 } 67 close(sock); 68 return 0; 69 }client端:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<errno.h> 5 #include<netinet/in.h> 6 #include<arpa/inet.h> 7 #include<sys/types.h> 8 #include<sys/socket.h> 9 10 void usage(char *proc) 11 { 12 printf("%s [ip][port]\n",proc); 13 } 14 15 int main(int argc,char *argv[]) 16 { 17 if(argc!=3) 18 { 19 usage(argv[0]); 20 exit(1); 21 } 22 int sock=socket(AF_INET,SOCK_DGRAM,0); 23 if(sock<0) 24 { 25 perror("socket"); 26 exit(2); 27 } 28 char *ip=argv[1]; 29 int port=atoi(argv[2]); 30 31 struct sockaddr_in client; 32 client.sin_family=AF_INET; 33 client.sin_port=htons(port); 34 client.sin_addr.s_addr=inet_addr(ip); 35 36 char buf[1024]; 37 while(1) 38 { 39 memset(buf,'\0',sizeof(buf)); 40 ssize_t _s=read(0,buf,sizeof(buf)-1); 41 _s=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client ,sizeof(client)); 42 } 43 return 0; 44 }实现结果:
![](http://s5.51cto.com/wyfs02/M00/82/C1/wKioL1dgEJbhmc1sAABrNo1QJqE772.png)
相关文章推荐
- C#基于UDP实现的P2P语音聊天工具
- C#基于UDP进行异步通信的方法
- 距离详解Linux下的UDP方式通讯
- C#中使用UDP通信实例
- Linux网络编程之UDP Socket程序示例
- 服务器 UDP端口占用几千个的解决办法
- Android网络编程之UDP通信模型实例
- udp socket客户端和udp服务端程序示例分享
- PHP的Socket通信之UDP通信实例
- 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
- Android编程实现基于局域网udp广播自动建立socket连接的方法
- Android模拟器接收UDP数据包的若干问题分析
- Android中实现TCP和UDP传输实例
- android开发socket编程之udp发送实例分析
- Linux网络编程之基于UDP实现可靠的文件传输示例
- Linux中使用C语言实现基于UDP协议的Socket通信示例
- java编程实现基于UDP协议传输数据的方法
- python检测远程udp端口是否打开的方法
- python网络编程之数据传输UDP实例分析
- python基础教程之udp端口扫描