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

C 多个读/写请求上的套接字程序块,c,sockets,C,Sockets,我正在编写一个程序,用C语言编写套接字来检查传统TCP/IP的潜在吞吐量。目前,客户端和服务器之间传输的数据内容是无关的。唯一重要的是数据传输是否成功。假设客户机从服务器请求大量(比如10000)对读/写操作。我遇到了一些阻塞问题,在最初的几个操作之后,客户端和服务器都会暂停 客户端.c #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h&

我正在编写一个程序,用C语言编写套接字来检查传统TCP/IP的潜在吞吐量。目前,客户端和服务器之间传输的数据内容是无关的。唯一重要的是数据传输是否成功。假设客户机从服务器请求大量(比如10000)对读/写操作。我遇到了一些阻塞问题,在最初的几个操作之后,客户端和服务器都会暂停

客户端.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\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。但客户希望它
一些东西。这是一种可能的情况,即你最终会看到双方都在读。