C 多个读/写请求上的套接字程序块
我正在编写一个程序,用C语言编写套接字来检查传统TCP/IP的潜在吞吐量。目前,客户端和服务器之间传输的数据内容是无关的。唯一重要的是数据传输是否成功。假设客户机从服务器请求大量(比如10000)对读/写操作。我遇到了一些阻塞问题,在最初的几个操作之后,客户端和服务器都会暂停 客户端.cC 多个读/写请求上的套接字程序块,c,sockets,C,Sockets,我正在编写一个程序,用C语言编写套接字来检查传统TCP/IP的潜在吞吐量。目前,客户端和服务器之间传输的数据内容是无关的。唯一重要的是数据传输是否成功。假设客户机从服务器请求大量(比如10000)对读/写操作。我遇到了一些阻塞问题,在最初的几个操作之后,客户端和服务器都会暂停 客户端.c #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h&
#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\0", 5);
read(sockfd, sendline, 100);
write(sockfd, "write\0", 6);
write(sockfd, recvline, 100);
}
}
#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 request\n");
write(comm_fd, msg, 100);
readCount++;
}else if(strncmp(str, "write", 10) == 0){
printf("Recieved a write request\n");
memset(str, 0, 100);
read(comm_fd, str, 100);
writeCount++;
}
memset(str, 0, 100);
printf("read count: %d. write count: %d\n", readCount, writeCount);
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int-sockfd,n;
servaddr中的结构sockaddr_;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,servaddr的大小);
servaddr.sin_family=AF_INET;
servaddr.sinu port=htons(8080);
inet_pton(AF_inet,“192.168.0.3”和(servaddr.sin_addr));
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
字符发送线[100];
char recvline[100];
memset(sendline,01100);
memset(recvline,01100);
/*向服务器发送10000个读/写操作*/
对于(int i=0;i您没有检查read
和write
系统调用的返回值。任何读或写调用可能读取或写入的数据比请求的少,或者读取的数据可能比一次写入多,因此您需要检查调用的返回值,以查看实际传输或接收的数据量艾维德
可能发生的情况是,客户端发送一个6字节的“写入”字符串,后跟一个100字节的缓冲区,然后再发送另一个请求。服务器读取一个10字节的缓冲区,获取“写入”和缓冲区的前4个字节,然后读取100个字节(获取缓冲区的剩余96个字节和下一个请求的前4个字节)。然后它尝试读取另一个10字节的数据块来解码下一个请求,但前4个字节已丢失…我建议您在每次系统调用后添加错误检查,并打印每个read
和write
的返回值以进行调试,即使它们返回的不是错误。客户端在哪里和服务器代码暂停?您是否尝试将调试器附加到它们中的每一个?连接每一侧的控制台上打印的输出是什么?您不应该像这样在线路上发送未初始化缓冲区的内容。您的strncmp
不应该长于您正在比较的字符串。我怀疑是什么发生的情况是,您的str
数组既不包含“read”也不包含“write”,而是包含一些其他值,因此您的服务器的strncmp()测试都没有成功,并且事情从此处进一步恶化。您肯定需要检查read()
和write()的返回值
调用并根据程序实际发送(或接收)的字节数与您要求它们发送(或接收)的字节数来判断程序的行为。您是否知道TCP连接是一个字节流,并且read
可以从该流中读取任意数量的字节?例如,服务器的第一个read
调用可能返回“rea”。这不是“读”或“写”,所以它会返回并再次读
s。但客户希望它写
一些东西。这是一种可能的情况,即你最终会看到双方都在读。