繁体   English   中英

如何通过sock_stream发送字符串,一次发送一个字符

[英]how to send string, one char at a time through sock_stream

我在通过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;
    }
}

我将如何实施呢? 谢谢。

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。

你需要换线

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

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

此外,您可以使用

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

启用TCP_NODELAY选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM