【发布时间】:2014-08-14 10:06:48
【问题描述】:
我想与服务器建立 1000 个连接。只有在建立所有连接后,我才想开始在连接上发送或接收数据。
服务器很简单,它只是接受连接,然后按顺序执行读取和写入。服务器有 8192 的积压,并在从第一个连接读取时阻塞:
// Why doesn't backlog of 8192 allow the client to establish 1000 connections?
listen(serversocket, 8192);
while(1) {
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int fd = accept(serversocket, (struct sockaddr*)&client_addr, &client_addr_len);
// This blocks the server on a read from the 1st connection
short data1;
read(fd, &data1, sizeof(data1));
char data2[32];
write(fd, data2, sizeof(data2));
close(fd);
}
客户端包含以下代码:
int sockfds[1000];
int i;
for(i=0; i<1000; i++) {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockfds[i] = sockfd;
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(5678);
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
printf("%d: connected\n", i);
}
// ... read from sockfds[j], write to sockfds[j]
前 130 个连接在几毫秒内建立。但是,连接 130...999 的建立速度非常缓慢,速度约为每秒 1 个连接。
client.c 应该怎么做才能在几毫秒内建立所有 1000 个连接?为什么8192的backlog不允许客户端建立1000个连接?
【问题讨论】:
-
为什么?为什么不一有连接就开始使用呢?为什么是1000?服务器真的能处理1000个连接吗?
-
这是一个服务器基准测试。基本上,服务器以
listen(serversocket, 8192)开始,然后在while 循环中执行accept(serversocket, ...)。 -
我检查了服务器。它实际上无法处理 1000 个连接,但我认为在服务器上积压 8192 将允许客户端建立 1000 个连接。似乎上一句中的假设是不正确的。
-
您确定客户端确实在建立连接吗?我在该代码中没有看到错误检查。
-
@Atom 你能展示一下演示问题的真实代码吗?以防万一被删除的东西是造成缓慢的原因。
标签: c linux sockets tcp latency