Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
select()ed套接字无法接收()完整数据_C_Sockets - Fatal编程技术网

select()ed套接字无法接收()完整数据

select()ed套接字无法接收()完整数据,c,sockets,C,Sockets,使用以下用于将数据发送到本地套接字的伪Python脚本: s = socket.socket(AF_UNIX, SOCK_STREAM) s.connect("./sock.sock") s.send("test\n") s.send("aaa\0") s.close() 我的C程序将随机结束recving以下缓冲区: 测试\n 测试\n 测试\naaa(如预期) 在select()指出套接字是可读的之后,recv()。问题是,如何避免前两种情况 附带问题:是否可以从该脚本发送以下两条消息

使用以下用于将数据发送到本地套接字的伪Python脚本:

s = socket.socket(AF_UNIX, SOCK_STREAM)
s.connect("./sock.sock")
s.send("test\n")
s.send("aaa\0")
s.close()
我的C程序将随机结束
recv
ing以下缓冲区:

  • 测试\n
  • 测试\n
  • 测试\naaa
    (如预期)
select()
指出套接字是可读的之后,
recv()。问题是,如何避免前两种情况

附带问题:是否可以从该脚本发送以下两条消息:

  • asd\0
  • dsa\0

并让
select()
在每个
send
s上显示可读取的套接字,或者仅当我再次运行脚本(重新启动套接字客户端
connect
ion)并为每个
connect

发送消息时,它才会这样做,的
len
参数指定要读取的最大数据量,而不是要返回的精确数据量
recv
可以自由返回最多
len
字节的数据量

如果要读取特定数量的字节,请在循环中调用
recv

 int bytes = 0;
 while (bytes < len) {
    int remaining = len - bytes;
    int read = recv(sockfd, buf+bytes, remaining, 0);
    if (read < 0) {
        // error
        break;
    }
    bytes += read;
 }
int字节=0;
while(字节

如Junx所指出的,如果您需要发送不可预测的数据量,请考虑定义一个简单的协议,该协议要么启动每个消息的长度,要么用一个特定字节或字节序列结束。我猜你没有注意到你收到了多少字节,你没有重复收到。。。但这只是猜测,@Matoe应该考虑一个合适的协议定义来发送他的数据,比如(\n作为帧分隔符或其他什么),因为数据可以分块,但是TCP/IP堆栈喜欢分块。我以前错过了第二个问题。恐怕我现在不太明白。如果有帮助,您可以在连接的套接字上随时调用send。所有数据都将传送到服务器。如果关闭客户端套接字,则必须在进一步发送之前再次调用connect。