我被unix套接字(TCP本地协议)弄糊涂了。
我有一个服务器和一个客户机:
send)向服务器发送一些信息recv接收数据)。问题是,服务器不仅打印client发送的最后信息,而且还打印来自客户端的一些旧信息(有时已损坏),因此我认为套接字以某种方式积累了client写入的所有以前的数据。
服务器如何只接收来自客户端的最后数据?我应该以某种方式清理这个套接字,还是应该一直关闭它并创建新的(非常糟糕的解决方案)?
发布于 2013-04-26 20:12:06
TCP套接字是流套接字。
这意味着您发送的所有数据都不是作为消息序列处理,而是作为字节序列处理。字节是按顺序接收的,没有添加或遗漏,但不一定在相同的块中。
例如,如果客户端每次调用send 3次,每次调用1000个字节,则无法判断recv将返回多少次数据。它可以返回3次,每个返回1000字节,或者只返回一次,每次返回3000字节,或者理论上返回3000次,每次返回1字节。
发布于 2013-04-26 20:18:00
将发送/接收的字节放在队列中(内部缓冲区)。如果您调用send()两次,每次发送10个字节,缓冲区中将有20个字节。当另一方调用recv()时,它将从队列中取出许多字节,并将它们放在传递的数组中。多少字节?最多可得(20),或更少。
例如,如果你打电话给
nb = recv(socket, arr, 15,...);然后只消耗15个字节(想必您的数组arr有此长度),它们将被复制到arr中,nb为15,而在内部缓冲区中只剩下5个字节。
如果我们给你打电话
nb = recv(socket, arr, 100,...);然后将20个字节复制到arr中,nb为20,内部缓冲区为空。
这向你表明:
send()/recv()呼叫是一对一通信中的而不是。recv返回(nb)以知道读取了多少字节。send()调用中发送了哪些字节。“讯息”的界定由你决定。printf("%s",arr)来查看接收到的字节发布于 2013-04-27 05:17:57
确保您在发送方发送的内容是在接收方得到的。
对于进一步的分析来说,一段代码是很受欢迎的。
https://stackoverflow.com/questions/16243975
复制相似问题