none
“Socket”发送数据的疑问? RRS feed

  • 问题

  • socket.Send(buf, buf.Length, SocketFlags.None);//发送1W字节 (嵌入式PC)


    socket.Receive(buf, 100000, SocketFlags.None);//接收10W字节(PC)

    问题一:
           这里发送了1W字节,但是接收时候,虽然是接收10W字节。但是,第一次接收,缺只接收了4000字节,是因为客户端的问题,数据是分几次发送过来的吗???                     ( 这里是嵌入式PC上运行的时候,如果是PC的话,发送多少,一次就可以接收多少。)

    问题二:
            是不是应该给发送的数据包加一个停止符,标示此数据包结束。这样“socket.Receive”循环读取,然后将读取到的数据进行分割???      

    问题三:
             如果用List<string>存储每次循环读取到的字节,这个思路可行吗???       分割的时候好像不是太好进行,大家有什么好的思路吗?
            
    问题四:
            局域网内一次收发多少自己比较合适,在公网上多少字节合适???


    问题五:
           大家在进行Socket收发的时候,都是怎么操作的。   也没有什么切片的好的思路???

    Science and technology is my lover.

    2014年9月24日 6:41

答案

  • 你好:

    Socket.Send方法的发送字节Buffer Size上限应该是没有限制的,因为MSDN文档中没有标明上限:

    http://msdn.microsoft.com/en-us/library/w93yy28a.aspx

    但是Socket.Receive方法是不知道发送方总共发送了多少字节的,有可能发送方发送了两次,接收方一次就接收完了,也有可能发送方只发送了一次,而接收方分好几次才能接收完。在MSDN文档的实例中使用的接收方的Buffer Size为8K(8192):

    http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receivebuffersize(v=vs.110).aspx

    可以参考MSDN文档设置Buffer Size。因为消息发送的时候实际上是字节流,本身是没有边界的,所以需要自己来处理消息的边界问题,像你说的在消息的开头和结尾定义特定的标识符是可行的。但是如果你在发送的实际消息之前先给接收方发送一个消息头,标注一下接下来要发送的消息的具体信息,比如消息的长度,消息的编码方式等等,这样就更容易处理。

    实际上就是自定义一个消息交换的协议,像TCP/UDP协议都是通过这样的方式基于Socket来实现的,只不过格式稍微复杂一点而已,应用层面的HTTP/FTP等协议就是在TCP/IP协议上的又一次封装。基本的处理消息的思路就是这样的。当然我建议你直接使用.net中已经封装好的对一些基本协议的实现,比如TcpClient, UdpClient,HttpWebRequest, FtpRequest等等,当然如果你实在想实现一个自己的通讯协议,那么就从最底层的Socket做起,自己处理消息的各种问题。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月25日 2:32
    版主