![](/img/trans.png)
[英]SOCK_STREAM socket listen() causing TCP syn/ack to be sent
[英]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.