UNIX网络编程:UDP缺乏流量控制(改进版)
发布时间:2016-09-09 21:18:10 所属栏目:Unix 来源:站长网
导读:现在我们查看无任何流量控制的UDP对数据报传输的影响。首先我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读。如下,它写2000个1400字节大小的
服务器程序serv.c: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<string.h> #include <signal.h> #define SERV_PORT 3333 #define MAXLINE 1024 #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while (0) typedef struct sockaddr SA; static void recvfrom_int(int); static int count; void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen) { socklen_t len; char mesg[MAXLINE]; signal(SIGINT, recvfrom_int); for ( ; ; ) { len = clilen; recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); count++; } } static void recvfrom_int(int signo) { printf("nreceived %d datagramsn", count); exit(0); } int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr, cliaddr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(sockfd, (SA *) &servaddr, sizeof(servaddr)); dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr)); } 如果客户端运行在快速的主机,服务器运行在慢速的主机,一般会出现丢包现象。 UDP套接字接收缓冲区 由UDP给某个特定套接字排队的UDP数据报数目受限于该套接字接收缓冲区的大小。我们可以使用SO_RCVBUF套接字选项修改该值。 修改服务器程序serv.c的函数dg_echo: static void recvfrom_int(int); static int count; void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen) { int n; socklen_t len; char mesg[MAXLINE]; signal(SIGINT, recvfrom_int); n = 220 * 1024; setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)); for ( ; ; ) { len = clilen; recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); count++; } } static void recvfrom_int(int signo) { printf("nreceived %d datagramsn", count); exit(0); } 作者:csdn博客 ctthuangcheng 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |