在 C# 中获取套接字对象的流

Posted

技术标签:

【中文标题】在 C# 中获取套接字对象的流【英文标题】:get stream of a socket object in c# 【发布时间】:2012-05-18 03:40:35 【问题描述】:

我有一个通过 TCP/IP 进行通信的客户端-服务器应用程序。 我使用System.Net.Sockets.Socket 类型对象通过 TCP 进行异步通信。基本上我打开连接发送/接收数据并关闭连接。而我的实现是基于 Socket 类型的对象。 现在我需要使用第三方 dll 来做一些事情。这个 dll 需要一个 System.IO.Stream 类型的对象。所以我需要获取我的 Socket 对象的 Stream 对象。 我该怎么做? 谢谢。

【问题讨论】:

混合使用 Socket 和 Stream 时要小心 - 套接字实例是线程安全的 - 流实例不是! 【参考方案1】:

试试看 System.Net.Sockets.SocketType.Stream 吗?

或者尝试查看 System.Net.Sockets.NetworkStream ?

http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

【讨论】:

谢谢约翰,@Chris Shain 的回答很有效。这就是我需要的。【参考方案2】:

真的很简单。 NetworkStream 类的构造函数接受要包装的套接字:

http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

// NOTE: This demonstrates disposal of the stream when you are 
// done with it- you may not want that behavior.
using (var myStream = new NetworkStream(mySocket)) 
    my3rdPartyObject.Foo(myStream);

【讨论】:

以防该流的用户想要调用myStream.Close(),我建议使用套接字所有权构造 NetworkStream:new NetworkStream(mySocket, true)。否则你最终会想知道为什么在读操作中阻塞的线程在关闭流后仍然被阻塞。

以上是关于在 C# 中获取套接字对象的流的主要内容,如果未能解决你的问题,请参考以下文章

通过 ioctl 调用套接字文件描述符获取数据包时间戳

一起talk C栗子吧(第一百五十八回:C语言实例--基于AF_INET域的流套接字通信)

使用 BinaryReader/Writer 的 C# Socket 从读取器获取错误数据

socket.io+redis+expressjs 集群 - 在 expressjs 请求中获取套接字对象

C#中的客户端套接字

如何使用套接字编程定义客户端服务器并将数据库传递给 C# 中的客户端