【问题标题】:Read function in Network Programming in CC语言网络编程中的读取函数
【发布时间】:2009-11-22 13:48:01
【问题描述】:

我使用此代码从套接字读取:

int n ;
char buffer[256];
n = read(newsockfd, buffer, 255);
    if (n < 0)
    {
        error("ERROR reading from socket");
    }

如果必须读取的数据大于 255 字节(例如 1000),则必须进行哪些更改?

我知道改变char buffer[1000],我需要不同的解决方案。

【问题讨论】:

  • 我认为正确的代码取决于您希望如何处理传入的数据、如何处理信号、套接字如何超时,以及newsockfd 是处于阻塞模式还是非阻塞模式?

标签: c sockets network-programming connection


【解决方案1】:

只需从套接字读取几次,直到获得所有想要接收的数据。

例如接收 1000 个字节,它可能看起来像这样(成功时read 返回读取的字节数):

int received = 0;
while (received < 1000) {
  n = read(newsockfd, buffer, 255);
  // error checking...
  // do something with the partial data in "buffer"...
  received += n;
}

【讨论】:

  • 如何使用循环什么是循环的变量
  • 我添加了一个例子。在每次迭代中如何处理buffer 中的数据取决于您希望如何进一步处理收到的内容。
【解决方案2】:

使用类似的东西:

char buffer[256];
memset(buffer, 0, sizeof(buffer));
char* pBuf = buffer;
int bytesLeft = sizeof(buffer) - sizeof(char);

while(bytesLeft > 0)
{
    int n = read(newsockfd, pBuf, bytesLeft);
    if (n < 0)
    {
        error("ERROR reading from socket");
        break;
    }
    if(n == 0)
    {
        error("peer shutted down");
        break;
    }
    pBuf += n;
    bytesLeft -= n;
}

【讨论】:

  • +1 但是......如果有一个'sizeof'会更好 - 255 ==> sizeof(buffer)-1,我假设(与问题一致)。我不清楚为什么有一个字节未使用;大概对于字符串中的终端 null 。此外,Q 询问“超过 255 个字节”,但答案没有这样做。 'while(true)' 条件会比 'while (bytesLeft > 0)' 更好,你可以避免循环中的最后一个条件。您是否应该担心“n == 0”(EOF - 套接字的另一端消失了)?
  • 这将如何读取超过 255 个字节?此代码将读取最多 255 个字节;只是它会分块读取它。可能是我错过了一些东西。如果我是,请炸我:)
  • char pBuf = buffer; 应该是 char *pBuf = buffer; 否则我认为它甚至不会编译。
  • @Jonathan Leffler 你在所有方面都是对的。我会更正代码。 @billyswong 是的,那是一个错字。谢谢
  • 你为什么要做 pBug += n: ? n 是一个整数,pbuf 是一个指向 char 的指针。看起来 read 正在填充这个“字符串”,所以我不明白你为什么要添加读取字节数。
【解决方案3】:

你检查过errno吗? http://linux.die.net/man/2/read

如果您需要更多数据,请使用循环,不是吗?

【讨论】:

    【解决方案4】:

    将 read 的第三个参数改为 1000 是否有效?即

    char buffer[1001];
    read(newsockfd, buffer, 1000);
    

    如果read 函数不接受这么大的计数,您可能会多次读取它。在循环中,跟踪您到目前为止阅读了多少字符并使用read(newsockfd, buffer+m, 1000-m);

    【讨论】:

      【解决方案5】:

      除了上述解决方案之外,您甚至可以通过为缓冲区分配更多内存来读取任意数量的字节(假设您事先不知道要在套接字上发送多少字节)每当您达到相同的最大限制时,您就在阅读。

      【讨论】:

      • 是的,可以重新分配同一个缓冲区数组。
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2016-08-06
      • 2021-02-06
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多