【Linux】中UDP_server的实现
来源:互联网 发布:gbic端口 编辑:程序博客网 时间:2024/06/16 14:36
udp协议是面向数据报的,无连接不可靠的传输层协议,因为udp无连接,因此实现udp socket不需要监听也不需要连接。在实现tcp socket时,其中的收发数据可以当做文件,通过read和write来读取(TCP是面向字节流的),而udp是面向数据报的协议,收发的单位都是数据报,需要采用专门的函数:
编写代码:
#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<string.h>void usage(const char*proc){printf("Usage:%s,[udp_ip],[udp_port]\n",proc);}int main(int argc,char* argv[]){if(argc != 3){usage(argv[0]);return 1;}int sock = socket(AF_INET,SOCK_DGRAM,0);if(sock<0){perror("socket");return 2;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr=inet_addr(argv[1]);if(bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr))<0){perror("bind");return 3;}while(1){struct sockaddr_in client_addr;socklen_t len = sizeof(client_addr);char buf[1024];if(recvfrom(sock,buf,1024,0,(struct sockaddr*)&client_addr,&len)<0){perror("recvfrom");return 4;}printf("recv is %s\n",buf);char buff[1024];printf("server :");scanf("%s",buff);if(sendto(sock,buff,1024,0,(struct sockaddr*)&client_addr,sizeof(client_addr))<0){perror("sendto");return 5;}}close(sock);return 0;}
udpclient.c#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<string.h>void usage(char* proc){printf("Usage:%s,[udp_ip],[udp_port]\n",proc);}int main(int argc,char* argv[]){if(argc!=3){usage(argv[0]);return 1;}int sock = socket(AF_INET,SOCK_DGRAM,0);if(sock<0){perror("socket");return 2;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));server_addr.sin_addr.s_addr = inet_addr(argv[1]);while(1){char buff[1024];printf("client #");scanf("%s",buff);if(sendto(sock,buff,1024,0,(struct sockaddr*)&server_addr,sizeof(server_addr))<0){perror("sendto");return 3;}char buf[1024];socklen_t len = sizeof(server_addr);if(recvfrom(sock,buf,1024,0,(struct sockaddr*)&server_addr,&len)<0){perror("recvfrom");return 4;}printf("recv is %s\n",buf);}close(sock);return 0;}
如何实现可靠性:
UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
实现确认机制、重传机制、窗口确认机制。
如果你不利用Linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送:包的分片、包确认、包的重发
接收:包的调序、包的序号确认
阅读全文
0 0
- 【Linux】中UDP_server的实现
- linux之UDP_server
- udp_server
- udp_server
- udp_server
- udp_server
- UDP_server
- udp_server
- udp_server
- udp_server
- UDP_server服务器和用户空间下如何实现可靠性
- 使用udp_client或者udp_connect和udp_server 的时间获取函数
- 【网络】udp_server
- Linux中PCI的实现
- Linux中PCI的实现
- linux中who的实现
- 【Linux】中TCP_server的实现
- Linux中skbuff的实现(转载)
- CentOS7 配置SOCKS5代理服务
- 构建高并发高可用的电商平台架构实践
- 深度学习里面的batchsize设置
- flask 蓝图
- Vue-router2.0版本的使用
- 【Linux】中UDP_server的实现
- 003
- Java学习之路--计算圆形的面积和周长
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- ios-设置UISearchBar输入框的颜色等属性
- Android中关于签名的一些知识
- 支持向量机
- JSP_strut2架构下前台接收后台传递到前台之数据并处理以使用的一种方法
- ios AudioUnit bluetooth 录音 播放 实现