【问题标题】:how to send string, one char at a time through sock_stream如何通过 sock_stream 一次发送一个字符串
【发布时间】:2016-03-10 03:34:50
【问题描述】:

我无法通过 sock_stream 连接发送一个字符串,一次一个字符。这样做的原因是我试图一次发送多个近 70000 个字符的字符串。我尝试使用的写入函数似乎需要一个字符串。

for(i=0;i<BUF_SIZE;i++)
{
    write(sockfd,plaintext[i],1);
    if(plaintext[i]=='0')
        break;
}
write(sockfd,'^',sizeof(char));

另外,我该如何阅读?以下是我的尝试。

int read_line(int fd,char message[])
{
    size_t message_len=0;
    while (message_len<BUF_SIZE)
    {
        char c;
        int ret = read(fd, &c, 1);
        if (ret < 0)
        {
            message[message_len] = 0;
            return len; // EOF reached
        }
        if (c == '^')
        {
            read(fd,&c,1);
            message[message_len] = 0;
            return message_len; // EOF reached
        }
        data[len++] = c;
    }
}

我将如何实现这一点?谢谢。

【问题讨论】:

  • 我很确定一次发送一个字符比批量发送要慢很多。
  • 我绝对确定您是正确的,但是我发送了多条消息,这些消息太大而无法批量发送。我可以在达到一定数量的字符后分解每条消息,但就本次作业而言,这似乎只会导致更多的错误可能性。

标签: c sockets serversocket


【解决方案1】:

write api的签名是: int write(int fd, const void *buf, size_t nbyte);

那么你可以做什么:

#define BUF_SIZE 70000
char *buf = (char*)malloc(BUF_SIZE);
int written = 0;
int wrote;
if (buf)
   memset(buf, 1, BUF_SIZE);
else
   return written;//some error code

while (written < BUF_SIZE)
{
  wrote = write(fd, buf, BUF_SIZE);
  if (wrote < 0)
    return written;
  written += wrote;
}

同样,您应该尝试进行批量读取,因为一次读取一个字符太慢,除非您有非常正当的理由。每次你写或读时,它的系统调用和它们都是昂贵的。

所以对于阅读,你可以尝试类似的东西

int read_bytes = read(fd, buf, BUF_SIZE);

并且 read_bytes 将具有您已阅读量的确切值。

然后执行 parse_buf(buf) ,您可以在其中找到您要查找的标签,然后将其余部分保存以备将来获取更多数据,否则如果您获取的数据较少,则再次调用 read。

【讨论】:

    【解决方案2】:

    你需要换行

    write(sockfd,plaintext[i],1);
    

    write(sockfd,&plaintext[i],1);
    

    另外,你可以使用

    setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
    

    启用TCP_NODELAY 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多