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

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

【问题讨论】:

  • 混合使用 Socket 和 Stream 时要小心 - 套接字实例是线程安全的 - 流实例不是!

标签: c# sockets 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)。否则你最终会想知道为什么在读操作中阻塞的线程在关闭流后仍然被阻塞。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多