C 在服务器在套接字上关闭连接之前,客户端打印一半数据

C 在服务器在套接字上关闭连接之前,客户端打印一半数据,c,sockets,client-server,C,Sockets,Client Server,我有这种情况。我正在尝试使用C中的套接字发送和接收数据。客户端发送一些字符串,服务器处理它,然后将其发送回客户端。一切正常,但一个小问题是:客户端只从服务器接收第一行,显示它,然后暂停,直到超时后服务器关闭连接。虽然服务器发送的字节数=客户端接收的字节数。一旦连接关闭,客户端就会显示字符串的其余部分 我想知道你的想法和可能的问题。如果你有任何问题,请告诉我 使用的协议:TCP 以下是服务器的代码: for (;;) { n=recv(s, buf, RBUFLEN

我有这种情况。我正在尝试使用C中的套接字发送和接收数据。客户端发送一些字符串,服务器处理它,然后将其发送回客户端。一切正常,但一个小问题是:客户端只从服务器接收第一行,显示它,然后暂停,直到超时后服务器关闭连接。虽然服务器发送的字节数=客户端接收的字节数。一旦连接关闭,客户端就会显示字符串的其余部分

我想知道你的想法和可能的问题。如果你有任何问题,请告诉我

使用的协议:TCP

以下是服务器的代码:

for (;;)
    {
            n=recv(s, buf, RBUFLEN-1, 0);
        if (n < 0)
        {
            printf("Read error\n");
            closesocket(s);
            printf("Socket %d closed\n", s);
            break;
        }
        else if (n==0)
        {
            printf("Connection closed by party on socket %d\n",s);
            closesocket(s);
            break;
        }
        else
        {
            printf("Received line from socket %03d : \n",s);
            printf("N bytes received: %d \n",n);
                     // DoSomeOperationsOnTheData() 
                 if(send(s, buffer, n, 0) != n)
            printf("Write error while replying\n");
        else
        {
            printf("Reply sent: %d bytes\n",n);
        }
    }
发送后尝试刷新数据。 如果使用带fdopen的套接字,则需要

FILE *fdsock = fdopen(sock, "a+");
...
fwrite(fdsock, 1, 1 "A");
fflush(fdsock);
...
fclose(fdsock);
要完成套接字,请关闭
shutdown(sock,SD_SEND)

更新

将memset从循环中取出

do
{
  memset(buffer, 0, BUFFER_SIZE);    //  init line
  rc = read(sd, buffer, BUFFER_SIZE);
  printf("\nReceived bytes: %d", rc);
  if( rc > 0)
  {
    printf("%s",buffer);
    size +=rc;
  }
}while(rc>0);
应该是:

memset(buffer,0x0,BUFFER_SIZE);    //  init line
size_t size = 0;
size_t toread = BUFFER_SIZE;
do
{
  ssize_t rc = read(sd, buffer+size, toread);

  if (rc > 0)
  {
    printf("\nReceived bytes:%zd", rc);
    printf("%s", buffer);
    size += rc;
    toread -= rc;
  }
  else if (rc == 0)
  {
    printf("The server hung up.\");
    break;
  }
  else
  {
    perror("read() failed");
    break;
  }
} while (toread);

if (toread < BUFFERSIZE)
{
  printf("Warning: Read less bytes (%zu) then expected (%d).\n", toread, BUFFERSIZE);
}
memset(缓冲区,0x0,缓冲区大小);//初始线
大小\u t大小=0;
大小存储=缓冲区大小;
做
{
ssize_t rc=读取(sd、缓冲区+大小、存储读取);
如果(rc>0)
{
printf(“\n收到的字节数:%zd”,rc);
printf(“%s”,缓冲区);
尺寸+=钢筋混凝土;
探路者-=rc;
}
else if(rc==0)
{
printf(“服务器挂断\”);
打破
}
其他的
{
perror(“读取()失败”);
打破
}
}而(探路者);
if(探路者<缓冲区大小)
{
printf(“警告:读取的字节数(%zu)少于预期的(%d)。\n”,toread,BUFFERSIZE);
}

我有个问题。你的代码看起来像什么?另外,请看[()据我所知,您现在可以看到代码,但这不起作用。请看例如[()哎哟…!这甚至不应该编译,但至少要发出警告。套接字是使用无缓冲I/O写入的,因此不需要刷新。一旦
write()
返回的数据在ip堆栈中处于关闭状态。抱歉,忘记写入。如果套接字将打开fdopen(sock,“w+”),则使用此选项;伙计们,从某种意义上说,客户端一次收到了所有数据,但干扰了其他部分。因此,我不打算采用这种解决方案。效果非常好!!!意味着问题出在客户端。我以为是服务器。:)谢谢你们和这里的其他人!我希望我能做到+1,但我的声誉很低。:(很抱歉这么说。@IbrahimNadir:但你还是可以接受这个答案吗?
memset(buffer,0x0,BUFFER_SIZE);    //  init line
size_t size = 0;
size_t toread = BUFFER_SIZE;
do
{
  ssize_t rc = read(sd, buffer+size, toread);

  if (rc > 0)
  {
    printf("\nReceived bytes:%zd", rc);
    printf("%s", buffer);
    size += rc;
    toread -= rc;
  }
  else if (rc == 0)
  {
    printf("The server hung up.\");
    break;
  }
  else
  {
    perror("read() failed");
    break;
  }
} while (toread);

if (toread < BUFFERSIZE)
{
  printf("Warning: Read less bytes (%zu) then expected (%d).\n", toread, BUFFERSIZE);
}