C# socket receive方法

C#中的socket中的receive方法一般这样使用:socket.Receive(recvBytes,recvBytes.Length,0);这句话是什么意思,因为在... C# 中的socket 中的receive方法一般这样使用:socket.Receive(recvBytes, recvBytes.Length, 0); 这句话是什么意思,因为在msdn上只能查到 receive(recvBytes, int32 offset, int32 size, socketflag),为什么查不到receive(recvBytes, int32, int32), 求大神指导! 展开
 我来答
Ben
2015-07-03 · 知道合伙人软件行家
Ben
知道合伙人软件行家
采纳数:860 获赞数:2875
认真回答者.

向TA提问 私信TA
展开全部

Receive 方法将数据读入 buffer 参数,并返回成功读取的字节数。 从面向连接的套接字和无连接套接字中都可以调用 Receive。

此重载仅要求您提供接收缓冲区。 缓冲区偏移量的默认值为 0,缓冲区的默认大小为缓冲区参数的长度,而 SocketFlags 的默认值为 None。

如果您使用的是面向连接的协议,则在调用 Receive 之前,必须调用 Connect 以建立远程主机连接,或者调用 Accept 以接受传入的连接。 Receive 方法只读取在 Connect 或 Accept 方法中建立的远程主机发送的数据。 如果您使用的是无连接协议,则您也可以使用ReceiveFrom 方法。 ReceiveFrom 将允许您收到从任何主机传入的数据。

如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。 如果超过超时值,Receive 调用将引发 SocketException。 如果您处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 Receive 方法将立即完成并引发 SocketException。 您可以使用 Available 属性确定是否有数据可以读取。 如果 Available 为非零,请重试接收操作。

如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止。 如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。

如果您使用的是无连接 Socket,则 Receive 将从您在 Connect 方法中指定的目标地址处读取第一个排队的数据报。 如果您接收到的数据报大于 buffer 参数的大小,则 buffer 将用消息的第一部分填充,多余的数据都会丢失,并且会引发 SocketException

public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        Console.WriteLine("Sent {0} bytes.", i);

        // Get reply from the server.
        i = server.Receive(bytes);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}
wdghy123
2014-03-19 · TA获得超过1583个赞
知道大有可为答主
回答量:1514
采纳率:95%
帮助的人:729万
展开全部

我在msdn查的,socket类的receive有好多重载啊

追问
是啊,有很多receive的重载,可是socket.Receive(recvBytes, recvBytes.Length, 0)同这个类型一样的重载没有啊,费解。
追答
Receive Method (array[]()[], Int32, 
SocketFlags)
这个不就是吗?SocketFlags是个枚举,可以用0作为输入啊
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
184779891
2014-03-19 · TA获得超过109个赞
知道小有建树答主
回答量:172
采纳率:0%
帮助的人:83.8万
展开全部
意思是接收Socket数据包 将数据包保存到 recvBytes的byte[]数组中,为了防止溢出 所以要加起点和长度。 通常就是直接用数组长度了,不过socket有个属性可以获取ReceiveLength byte数组初始化的时候直接为ReceiveLength就行了
追问
按照msdn上的说法 receive(buffer , int offset, int size, socketFlag),第一个int型是偏移量,第二个是大小,可是在使用的时候是receive(buffer, buffer.length, 0) ,哪道偏移量是buffer数组最后开始, 大小是0? 求指教
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式