【问题标题】:read from socket stops on last byte从套接字读取在最后一个字节停止
【发布时间】:2014-10-09 04:20:22
【问题描述】:

服务器.c

bytesReceived = 0;
    char buff[256];
    char* buffFile;
    char tempbuff;
    bytesReceived = read(clnt_fd, &tempbuff, 1);
    buffFile = (char*)malloc(sizeof(char));
    buffFile[0]=tempbuff;
    long incr=1;
    while(bytesReceived > 0 )
    {

        bytesReceived = read(clnt_fd, &tempbuff, 1);
        incr++;
        buffFile = (char*)realloc(buffFile, sizeof(char)*incr);
        buffFile[incr-1]=tempbuff;

    }

client.c

char filebuff[20];
strcpy(filebuff, "UPC ");
strcat(filebuff, file_size); //it's the file size
strcat(filebuff, " ");

write(clnt_fd, filebuff, strlen(filebuff));


while(1)
  {
  int nread = fread(file_bytes,1,256,fp);
  bytesSent = write(clnt_fd, file_bytes, nread);

  if(bytesSent<0) 
    {
      printf( "Error: %s\n", strerror( errno ) );
      break;
    }
  if(nread<256)
    {
        char t='\n';
        bytesSent = write(clnt_fd, &t, 1);
        break;
    }

}

所以基本上,客户端会发送这样的消息,我必须将'\n'作为最后一个字节。

UPC 5624 bytesbytesbytesetcetc\n

并且服务器将接收我放入数组中的那些字节,以便对其进行标记并从数组中获取这些字节以将其写入文件中。问题是,我做了一个计数器,我看到客户端发送了多少字节,每次循环结束时收到多少字节,我检查了最后一个字节,我的服务器阻塞读取功能并挂在那里。有什么想法吗?

【问题讨论】:

  • 我不明白这个问题。你一直在读,所以最终它会阻塞,直到更多的数据到达、发生错误或 EOS,这永远不会发生,因为对等方没有关闭他的结束。为什么你一次读一个字节?执行一次读取,进入一个足够大的缓冲区以容纳您所期望的内容,如果您没有得到全部内容,则循环。
  • 我不知道会有多少数据到达。我正在接收文件,它们的大小可能很大。

标签: c sockets tcp streaming


【解决方案1】:

我并不是一个真正的 C++ 人,但似乎在您进入 while 循环之前,您执行了一个“读取”。而当你进入循环时你再次执行'read',这似乎有点奇怪。

也做'incr++;'在您的 while 循环范围的底部。因为您已经从偏移量 1 开始。在你阅读/使用 incr 之前,你已经增加了 incr。 然后你不必在缓冲区数组中做 incr-1 (因为你在 while 循环的第一次迭代中也错过了 bufFile[0] 的第一个元素)

随便提一下,不知道这能解决你的问题(用手机键盘回答这个……)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2017-01-17
    • 2013-02-13
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多