c - 多个读/写请求上的套接字程序块



我正在编写一个程序来检查使用C中的套接字的传统TCP/IP的潜在吞吐量。目前,客户端和服务器之间传输的数据内容目前无关紧要。唯一重要的是数据成功传输。假设客户端请求大量(例如 10,000 个)来自/到服务器的读/写操作对。我遇到了一些阻塞问题,客户端和服务器在前几个操作后都停滞不前。

客户端.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc,char **argv)
{
int sockfd,n;
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof servaddr);
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);
inet_pton(AF_INET,"192.168.0.3", &(servaddr.sin_addr));
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
char sendline[100];
char recvline[100];
memset(sendline, 0, 100);
memset(recvline, 0, 100);
/*Send 10,000 read/write operations to the server*/
for(int i = 0; i<10000; i++){
write(sockfd, "read", 5);
read(sockfd, sendline, 100);
write(sockfd, "write", 6);
write(sockfd, recvline, 100);
}
}

服务器.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(8080);
bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
listen(listen_fd, 10);
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
int readCount = 0;
int writeCount = 0;
char str[100];
char msg[100];
/*Server listens for client requests.*/
while(1)
{
read(comm_fd, str, 10);
if(strncmp(str, "read", 10) == 0){
printf("Recieved a read requestn");
write(comm_fd, msg, 100);
readCount++;
}else if(strncmp(str, "write", 10) == 0){
printf("Recieved a write requestn");
memset(str, 0, 100);
read(comm_fd, str, 100);
writeCount++;
}
memset(str, 0, 100);
printf("read count: %d. write count: %dn", readCount, writeCount);
}
}

我怀疑两者中的一个正在等待另一个相反的I/O操作,即客户端想要读取,但服务器也想要读取而不是写入。所以我添加了一个初始写入操作,它可以是readwrite,它告诉服务器在传输实际内容之前将要发生什么。但这不能解决障碍?有人可以指出我正确的方向,导致阻塞的原因以及如何解决它吗?

您没有检查read的返回值并write系统调用。 任何读取或写入调用读取或写入的数据都可能少于请求的数据,或者读取的数据可能多于单次写入的数据,因此您需要检查调用的返回值以查看实际传输或接收的数据量。

可能发生的情况是,客户端发送一个6 字节的"写入"字符串,然后发送一个 100 字节的缓冲区,然后是另一个请求。 服务器读取一个 10 字节的缓冲区,获取"写入"和前 4 个字节的缓冲区,然后读取 100 个字节(获取缓冲区的剩余 96 个字节和下一个请求的前 4 个字节)。 然后它尝试读取另一个 10 字节的块来解码下一个请求,但它的前 4 个字节已经丢失......

最新更新