实现 Berkeley 套接字接口。
MSDN注解:
Socket
类为网络通信提供了一套丰富的方法和属性。
Socket
类允许您使用
ProtocolType
枚举中所列出的任何一种协议执行异步和同步数据传输。
Socket
类遵循异步方法的 .NET Framework 命名模式;例如,同步
Receive
方法对应于异步
BeginReceive
和
EndReceive
方法。
如果应用程序在执行期间只需要一个线程,请使用下面的方法,这些方法适用于同步操作模式。
-
如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用
Listen
方法侦听连接。
Accept
方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的
Socket
。可以使用此返回的
Socket
来调用
Send
或
Receive
方法。如果要指定本地 IP 地址和端口号,请在调用
Listen
方法之前先调用
Bind
方法。如果您希望基础服务提供程序为您分配可用端口,请使用端口号 0。如果希望连接到侦听主机,请调用
Connect
方法。若要进行数据通信,请调用
Send
或
Receive
方法。
-
如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用
ReceiveFrom
方法可接受任何传入的数据报。使用
SendTo
方法可将数据报发送到远程主机。
若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。
如果对一个套接字执行多个异步操作,它们不一定按启动时的顺序完成。
当数据发送和数据接收完成之后,可使用
Shutdown
方法来禁用
Socket
。在调用
Shutdown
之后,可调用
Close
方法来释放与
Socket
关联的所有资源。
通过
Socket
类,您可以使用
SetSocketOption
方法来配置
Socket
。可以使用
GetSocketOption
方法来检索这些设置。
Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 平台说明:
并非所有设备的操作系统会支持全部的套接字选项。
异步读取数据
/// <summary>
/// 异步读取数据
/// </summary>
private void AsyncRead()
var remote = (EndPoint) new IPEndPoint(0, 0);
_socket.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref remote, AsyncReadCallback,null);
/// <summary>
/// 异步读回调函数
/// </summary>
/// <param name="ar"></param>
public void AsyncReadCallback(IAsyncResult ar)
var remote = (EndPoint) new IPEndPoint(0, 0);
var size = _socket.EndReceiveFrom(ar, ref remote);
if (null != _callback && size > 0)
_callback(this, _buffer, 0, size, remote as IPEndPoint);
return;
//休眠15毫秒,防止使用CPU过高
Thread.Sleep(15);
//继续进行异步读取数据
AsyncRead();
CSDN里面有人讨论说,Net里的Socket的异步操作就是用完成端口来实现的,针对TCP的高效服务端模型(IOCP)。另外,在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员,提供了 Windows Sockets (Winsock) 接口的托管实现。针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。
讨论咨询的帖子;http://bbs.csdn.net/topics/390830639
我看都没C#的IOCP例程,不知是否C#开发服务器已经不需要考虑做IOCP形式?
跟c#没有关系,是.net framework封装了IOCP,你应该使用 TcpListener/TcpClient类,而不是Socket类!
正解,tcpclient内部已经实现了iocp.用reflector看代码就知道了,他用的是wsarecv方法。
其实你用socket的BeginRecive也一样,它也是调用的wsarecv
我也看到了源码里面调用的是WSARecv而且传入了WSAOVERLAPPED结构。
SocketAsyncEventArgs 用这个就是IOCP
要配合Socket m_Socket.ReceiveAsync(m_ReceiveEventArgs); 这个方法
Socket BeginReceive 这个有个缺点就是要一直装箱拆箱,所以在NET4.0就增加了m_Socket.ReceiveAsync(m_ReceiveEventArgs); 这个性能上会好很多。
C#可以用于编写简单、可扩展的Socket应用程序。主要流程包括创建、连接、发送/接收数据、断开连接、关闭并释放资源。上面是一个示例代码片段,它显示了如何使用C#编写socket应用程序。其他文章C#计算两线交点查看主页了解更多内容查看主页了解更多内容。
该楼层疑似违规已被系统折叠隐藏此楼查看此楼迟早得加 FAQ 套餐,列提纲(原理链接待补):0.不管 C 还是 C++ ,没真实项目需求的一律先劝退。1.没入门其中一种的,或者自认为入门过完全搞不清区别的,首先应该假定两者无关。2.官方关系:首先关于 spec :ISO C(ISO/IEC 9899 )和 ISO C++(ISO/IEC 14882 )都是 ISO/IEC JTC1/SC22 下的...
System.Net.Sockets命名空间主要是提供制作Sockets网络应用程序的相关类,其中Socket类,TcpClient类、TcpListener类、UdpClient类较为常用,下面对其进行介绍1、Socket类
Socket类为网络通信提供了一套丰富的方法和属性,主要用于管理连接,实现Berkelery通信段套接字接口,同时,还定义了绑定、连接网络端点以及传输数据所需的各种方法,并
昨天用自己的代码“暴力测试”Tcp C/S 的模式,修修改改之后倒是可以顺利运行:服务器能够收到客户端的连接和发送,客户端可以联机到服务器并发送数据,崩溃出现在客户端“断开”部分。客户端运行 BeginDisconnect 之后,服务器的独立线程的 While 循环部分立即出现“死循环”,用来显示状态信息的 ListBox 被快速添加刷新,不明白这是为什么呢?从 CodeProject ...
只支持win8以上系统以及windows server2012以上系统
最近在研究视频传输给浏览器,然后使用H5标签解码。视频流采用websocket传输。所以研究了一下C#的websocket。
首先使用HttpListener进行侦听,HttpListener监听需要启动管理员权限才能运行,或者注册该端口,注册如下:
已管理员身份运行cmd.exe 输入下面两个命令
netsh http...
Socket
我们要想实现两个程序在不同主机上进行相互通讯,我们就必须准确得标识这两个程序。我们知道对于一个程序来说其都有一个PID(即进程控制符),虽然对于同一台主机上来说PID是唯一的,但是在不同主机之间,两个程序的PID那就不一定是唯一的了,其极有可能会发生重复,因此我们无法使用PID来标识不同主机上的程序。
于是Socket变应运而生,其使用IP地址标识了主机后,再使用端口标识了程序,