UDP迭代服务器示例和UDP流量控制的缺失

来源:互联网 发布:淘宝商品图片拍摄技巧 编辑:程序博客网 时间:2024/06/07 03:34

        我们知道, 有tcp服务器, 也有udp服务器, 这是按照协议来区分的。 如果按照服务方式来分, 还可以分为迭代服务器和并发服务器。

        所谓迭代服务器, 就是单个进程/线程在单个端口上顺序处理所有客户端的请求, 而并发服务器就不一样了, 可以通过fork进程来并发处理多个客户端的请求。


        在本文中, 我们主要来说说UDP迭代服务器和UDP流量控制的缺失。

        我们来看一个最简单的UDP服务器(迭代服务器):

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main(){    struct sockaddr_in srvAddr;    bzero(&srvAddr,sizeof(srvAddr));    srvAddr.sin_family = AF_INET;    srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    srvAddr.sin_port = htons(8765);    int srvAddrLen = sizeof(srvAddr);    int iSock = socket(AF_INET, SOCK_DGRAM, 0);  // udp    bind(iSock, (struct sockaddr *)&srvAddr, sizeof(srvAddr));    while(1)    {char szBuf[65536] = {0};        recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&srvAddr, (socklen_t*)&srvAddrLen);        printf("msg from client [%s]\n", szBuf);    }    close(iSock);    return 0;}
       如果一个客户端发数据过来, 显然, 在while(1)中, printf会打印对应的信息。 如果第二个客户端过来, 显然, 程序第二次进入while, 第二次打印对应的信息。假设, 有n个客户端连接过来, 那么就循环n次打印信息。 一切看似完美。

       假设有1000个客户端几乎同时发请求过来(高并发访问), 那么就会有这样一种可能: 1000个客户端请求到达后, udp服务器可能还没有处理完第一个请求, 那剩余的请求怎么办呢? 肯定不能直接丢弃啊。

       是的, 操作系统协议栈会为这个udp socket所在的端口分配一个队列, 并发而来的客户端请求会被放到队列中, 并遵循FIFO的原则进行处理。

       我们看到, 这种服务的方式是单个udp socket在8765端口上顺序处理客户端请求的, 这就是迭代服务器。


        在极端情况下, 假设有1亿个客户端进行并发连接, 那么, 这个队列肯定是满了, 多余的请求会被直接丢弃, 而udp服务器没有能力对客户端说: 尼玛的, 你们请求太多了, 我处理不过来, 我压力好大, 你们行行好, 控制下请求的量吧。

        udp服务器没这个能力, 这就是udp的流量控制缺失, 用人话来说, 就是udp没有流量控制机制。

  

        先说这么多。


     

原创粉丝点击