【问题标题】:how to send part of char array with write() socket programming如何使用 write() 套接字编程发送部分字符数组
【发布时间】:2013-10-02 10:37:16
【问题描述】:

有人能告诉我一种使用 write() 通过 TCP 仅发送部分字符数组的方法吗?我想发送前 255 个字节,然后作为另一个数据块发送接下来的 255 个字节,依此类推/剩余而不是整个数据变量,例如:

 n = write(newsockfd,data,strlen(data));

有没有办法做到这一点?

【问题讨论】:

  • 255替换strlen(data)?
  • 我在想那个,我想我对 write() 的理解不够好。如果我执行 255,它将读取前 255 个字节,但如果我想在那之后发送 char 数组的下一个 255 个字节怎么办?我正在尝试以块的形式发送数据,而不是一整件事。
  • 然后您需要不断重复,直到剩下
  • 我发现这本书是一个很好的介绍:man7.org/tlpi希望有所帮助。
  • 那么是否有某种类型的指针/计数器可以跟踪我们正在读取的某些特定数据(在本例中为数据变量)的写入停止位置。我的印象是,如果我们重复相同的内容,它只会读取相同的 255 个字节。

标签: c sockets tcp


【解决方案1】:
int len = strlen(data);
for (int i = 0; i < len; )
{
    n = write(newsockfd, &data[i], min(len-i, 255));
    if (n < 0) {
        // error, do something ...
        break;
    } 
    i += n;
}

或者:

char *ptr = data;
int len = strlen(data);

while (len > 0)
{
    n = write(newsockfd, ptr, min(len, 255));
    if (n < 0) {
        // error, do something ...
        break;
    } 
    ptr += n
    len -= n;
}

【讨论】:

  • 我尝试了第二批代码,由于某种原因,它很容易中断。如果我的文件超过几百字节,或者我一次发送太多,它会在我发送后停止并且客户端没有收到任何内容......真的很困惑。
  • 刚刚测试了超过 94-95 字节的内容,它不再向客户端发送任何内容。什么可能导致这种情况?
  • 如果你使用send()而不是write(),你有同样的问题吗?您确定您的客户实际上正在读取和确认数据吗?您是否使用数据包嗅探器(如 Wireshark)查看过网络流量?
猜你喜欢
  • 2019-08-08
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多