我正在用C编写一个服务器程序,它将从客户端读取命令。命令是以5字节数据包的形式出现的,客户端将连续发送一组命令。我必须阅读每个命令的代码是:

while(1)
{
    char buffer[1024];
    int alreadyread = 0;
    int socket = dequeue();

    while(alreadyread != 5)
    {
        do
        {
            nowread = read(socket,buffer+alreadyread,5-alreadyread);
            alreadyread += nowread;
        }
        while((nowread > 0) && (5-alreadyread > 0));

        if(nowread == -1 || nowread == 0)
        {
            printf("Error reading from client socket\n");
            exit(1);
        }
              //DO COMMAND

但这似乎不起作用:如果客户端发送10个数据包,我读取1或2,然后得到一个segfault。有人知道为什么吗?

最佳答案

while (alreadyread != 5)似乎无关,因为alreadyread将是5或nowread在do do之后将小于0,如果nowread小于0,则退出。
你对命令的定义很差,我想我们需要更多的信息。
似乎每次命令后都会得到一个新的套接字。如果只是一个客户机发送命令,则应保留套接字,直到获得所需的所有命令。完成后还应该close套接字,这样就不会耗尽文件描述符。
segfault可能是由程序的另一个尚未显示的区域引起的。

关于c - 接收到1或2后停止从客户端读取数据包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30827912/

10-10 15:08