【问题标题】:What is the minimum number of bytes returned from Socket.Send从 Socket.Send 返回的最小字节数是多少
【发布时间】:2016-06-15 14:38:05
【问题描述】:

这类似于this question,但用于Socket.Send

给定一些这样的代码

int bytesSent = socket.Send(BitConverter.GetBytes((int)0));//send 4 bytes

socket.Send 的返回值是否可能小于 4? 在回答之前请继续阅读

文档明确指出:

Send 同步向 Connect 或 Accept 方法中指定的远程主机发送数据,并返回成功发送的字节数。

询问的原因是我正在尝试跟踪调用Socket.Send 的进程间套接字连接(两个进程在同一台服务器上运行,win2012 R2)的问题,如上所述。

虽然我熟悉通过套接字安全发送/接收字节我希望得到了解本机调用内部的人的确认,这可以确认进程间调用不发送 4 的可能性个字节,因此 Socket.Send 返回的字节数比这少。这可能在负载下实现吗?

可以通过正确写入套接字轻松修复代码,但如果有人看到这个并说no i would expect a **minimum** of 4 bytes for this type of call,那么显然这不是我的问题

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    来自remarks section here

    在非阻塞模式下,即使发送的字节数少于您请求的字节数,发送也可能成功完成。您的应用程序有责任跟踪发送的字节数并重试操作,直到应用程序发送请求的字节数。

    所以实际上归结为yourSocket.Blockingtrue 还是false。 IIRC,默认情况下这不是问题,如果您没有更改此属性,您应该没问题。

    【讨论】:

    • socket.Blocking == 在我的情况下为真(我没有设置)
    • @wal 那么我怀疑这是你的问题,但老实说,你可以在大约 2 分钟内在这里添加某种健全性检查 - 不要过多更改代码,基本上就是这样做 if(socket.Send(..., len) != len) throw new InvalidOperationException("Well damn, we found the problem"); (理想情况下还包括文本中的预期/实际数字)
    • Marc 作为后续可能会遇到此线程的人的后续行动,您暗示您只需要安全发送(即阅读Socket.Send 的结果并继续重新发送),如果您设置阻止为假?
    猜你喜欢
    • 2012-10-16
    • 2023-01-16
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2020-08-06
    相关资源
    最近更新 更多