C#的SOCKET是否已经内置了IOCP?

Jamescow 2014-07-09 12:28:18
我看都没C#的IOCP例程,不知是否C#开发服务器已经不需要考虑做IOCP形式?
...全文
1682 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
15665964 2018-07-14
  • 打赏
  • 举报
回复
异步还用while 吗?
SoulRed 2016-05-10
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.110).aspx
越过越咸 2015-11-12
  • 打赏
  • 举报
回复
本拉灯 2015-09-28
  • 打赏
  • 举报
回复
SocketAsyncEventArgs 用这个就是IOCP 要配合Socket m_Socket.ReceiveAsync(m_ReceiveEventArgs); 这个方法 Socket BeginReceive 这个有个缺点就是要一直装箱拆箱,所以在NET4.0就增加了m_Socket.ReceiveAsync(m_ReceiveEventArgs); 这个性能上会好很多。
Json1234562 2015-09-28
  • 打赏
  • 举报
回复
引用 29 楼 zhou23141622 的回复:
其实你用socket的BeginRecive也一样,它也是调用的wsarecv
我也看到了源码里面调用的是WSARecv而且传入了WSAOVERLAPPED结构
  • 打赏
  • 举报
回复
引用 楼主 Jamescow 的回复:
我看都没C#的IOCP例程,不知是否C#开发服务器已经不需要考虑做IOCP形式?
跟c#没有关系,是.net framework封装了IOCP,你应该使用 TcpListener/TcpClient类,而不是Socket类!
zhou23141622 2014-07-17
  • 打赏
  • 举报
回复
其实你用socket的BeginRecive也一样,它也是调用的wsarecv
zhou23141622 2014-07-17
  • 打赏
  • 举报
回复
引用 26 楼 sp1234 的回复:
[quote=引用 楼主 Jamescow 的回复:] 我看都没C#的IOCP例程,不知是否C#开发服务器已经不需要考虑做IOCP形式?
跟c#没有关系,是.net framework封装了IOCP,你应该使用 TcpListener/TcpClient类,而不是Socket类![/quote] 正解,tcpclient内部已经实现了iocp.用reflector看代码就知道了,他用的是wsarecv方法
xian_wwq 2014-07-17
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/magazine/cc163356.aspx 看看 SocketAsyncEventArgs 的论述
gwhzh 2014-07-16
  • 打赏
  • 举报
回复
应该是有的。begin,end.
save4me 2014-07-15
  • 打赏
  • 举报
回复
你的代码最后Socket RSocket = (Socket)AR.AsyncState;后面是不是有int REnd = RSocket.EndReceive(AR);?因为你的用了省略号,所以没看出来。 你的代码和C#实时通信这个很像的。
引用 18 楼 Jamescow 的回复:
[quote=引用 17 楼 Z65443344 的回复:] 不用非要第三方工具,自己做个全局静态变量,开线程就++,线程退出之前-- 放到界面上显示,用timer刷新就行 一段时间后看这个数变成多少了,就知道是否因为线程过多了
在哪一行加?我是这样启动线程的 开始的时候ServerThread = new Thread(new ThreadStart(RecieveAccept));这样开一个线程监听 然后 private void RecieveAccept() { while (true) { cs = ServerSocket.Accept(); cs.Blocking = false; cs.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), cs); } } 然后 private void RecieveCallBack(IAsyncResult AR) { try { Socket RSocket = (Socket)AR.AsyncState; …… 这里进行数据处理 RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket); } catch{...} } [/quote]
  • 打赏
  • 举报
回复
一个请求一个线程肯定不行啊,要想清楚,那些线程可都是在不断轮询的啊,这上下文切换太频繁了... 这是很明显的异步场景,iocp应该是最优解,
Jamescow 2014-07-15
  • 打赏
  • 举报
回复
引用 23 楼 sj178220709 的回复:
[quote=引用 22 楼 Jamescow 的回复:] [quote=引用 19 楼 sj178220709 的回复:] 一个请求一个线程肯定不行啊,要想清楚,那些线程可都是在不断轮询的啊,这上下文切换太频繁了... 这是很明显的异步场景,iocp应该是最优解,
我有个身份检查在数据处理那里,如果查询数据库不是合法用户,就会操作cs.close(). 这样会不会终止这个线程了?[/quote] while (true) {} 你又没break出去, 可以考虑加个try catch catch里面break循环 判定不通过,人为引发异常 而且好歹加个sleep啊,真是看见现在cpu便宜就不当回事啊![/quote] 这个TRY里BREAK的话,岂不是所有用户都给终止了?
  • 打赏
  • 举报
回复
引用 22 楼 Jamescow 的回复:
[quote=引用 19 楼 sj178220709 的回复:] 一个请求一个线程肯定不行啊,要想清楚,那些线程可都是在不断轮询的啊,这上下文切换太频繁了... 这是很明显的异步场景,iocp应该是最优解,
我有个身份检查在数据处理那里,如果查询数据库不是合法用户,就会操作cs.close(). 这样会不会终止这个线程了?[/quote] while (true) {} 你又没break出去, 可以考虑加个try catch catch里面break循环 判定不通过,人为引发异常 而且好歹加个sleep啊,真是看见现在cpu便宜就不当回事啊!
Jamescow 2014-07-15
  • 打赏
  • 举报
回复
引用 19 楼 sj178220709 的回复:
一个请求一个线程肯定不行啊,要想清楚,那些线程可都是在不断轮询的啊,这上下文切换太频繁了... 这是很明显的异步场景,iocp应该是最优解,
我有个身份检查在数据处理那里,如果查询数据库不是合法用户,就会操作cs.close(). 这样会不会终止这个线程了?
Jamescow 2014-07-15
  • 打赏
  • 举报
回复
引用 20 楼 save4me 的回复:
你的代码最后Socket RSocket = (Socket)AR.AsyncState;后面是不是有int REnd = RSocket.EndReceive(AR);?因为你的用了省略号,所以没看出来。 你的代码和C#实时通信这个很像的。 [quote=引用 18 楼 Jamescow 的回复:] [quote=引用 17 楼 Z65443344 的回复:] 不用非要第三方工具,自己做个全局静态变量,开线程就++,线程退出之前-- 放到界面上显示,用timer刷新就行 一段时间后看这个数变成多少了,就知道是否因为线程过多了
在哪一行加?我是这样启动线程的 开始的时候ServerThread = new Thread(new ThreadStart(RecieveAccept));这样开一个线程监听 然后 private void RecieveAccept() { while (true) { cs = ServerSocket.Accept(); cs.Blocking = false; cs.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), cs); } } 然后 private void RecieveCallBack(IAsyncResult AR) { try { Socket RSocket = (Socket)AR.AsyncState; …… 这里进行数据处理 RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket); } catch{...} } [/quote][/quote] 对的,和这个一样,有int REnd = RSocket.EndReceive(AR)
Jamescow 2014-07-14
  • 打赏
  • 举报
回复
引用 17 楼 Z65443344 的回复:
不用非要第三方工具,自己做个全局静态变量,开线程就++,线程退出之前-- 放到界面上显示,用timer刷新就行 一段时间后看这个数变成多少了,就知道是否因为线程过多了
在哪一行加?我是这样启动线程的 开始的时候ServerThread = new Thread(new ThreadStart(RecieveAccept));这样开一个线程监听 然后 private void RecieveAccept() { while (true) { cs = ServerSocket.Accept(); cs.Blocking = false; cs.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), cs); } } 然后 private void RecieveCallBack(IAsyncResult AR) { try { Socket RSocket = (Socket)AR.AsyncState; …… 这里进行数据处理 RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket); } catch{...} }
於黾 2014-07-10
  • 打赏
  • 举报
回复
不用非要第三方工具,自己做个全局静态变量,开线程就++,线程退出之前-- 放到界面上显示,用timer刷新就行 一段时间后看这个数变成多少了,就知道是否因为线程过多了
Jamescow 2014-07-10
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
检查下是否只有新增线程,而没有断开结束,导致线程不断增多
我用TCP查看工具检查过,连接的客户端都是正常的,没额外的。但服务器端会在用一段时间后,CPU占有率逐渐上升到100%。 不知还有什么工具是查线程的?
Jamescow 2014-07-09
  • 打赏
  • 举报
回复
引用 1 楼 songhtao 的回复:
没有,一般不用c#开发iocp,一般用vc做成dll给c#调用
原来这样……晕死……要重新学VC了。 那请问,原来的服务器端用C# SOCKET开发的,如果改VC的IOCP服务器端,客户端也要跟着改吗?
加载更多回复(14)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧