【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机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
 发送:包的分片、包确认、包的重发
 接收:包的调序、包的序号确认



原创粉丝点击