您的位置:首页 > 其它

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

2017-07-15 11:53 127 查看
        我们知道, 有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没有流量控制机制。

  

        先说这么多。

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: