c#使用winsock api实现同步Socket服务端

由于大多讲解winsock的代码都是c++的,而winsock只是一些windows api的使用,为了帮助.net程序员深入的理解winsock2,我把.net下同 步socket的实现代码拆了出来,简化了一下,大家有空可以调试一下看看。

注意

1、只能跑在win2000以上的系统

2、只支持tcp协议,

3、支持ipv4

改动

1、去掉计数器、日志等逻辑

2、不支持异步,完成端口模型,等有时间了,把完成端口那部分也拆分出来给大家。

为了不让本帖太短,贴一些代码中使用到的winsock函数的原型,大家要想开发高性能的网络程序,就得去深入理解winsock的那几个函数, 可以看看《windows网络编程》的第7、8、9章

OSSOCK#region OSSOCK
    [SuppressUnmanagedCodeSecurity]
    internal static class OSSOCK
    {
        [DllImport("ws2_32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
        internal static extern SocketError WSAStartup([In] short wVersionRequested, out WSAData lpWSAData);
        [DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern SafeCloseSocket.InnerSafeCloseSocket WSASocket([In] AddressFamily addressFamily, [In] SocketType socketType, [In] ProtocolType protocolType, [In] IntPtr protocolInfo, [In] uint group, [In] SocketConstructorFlags flags);
        [DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern unsafe SafeCloseSocket.InnerSafeCloseSocket WSASocket([In] AddressFamily addressFamily, [In] SocketType socketType, [In] ProtocolType protocolType, [In] byte* pinnedBuffer, [In] uint group, [In] SocketConstructorFlags flags);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern SocketError bind([In] SafeCloseSocket socketHandle, [In] byte[] socketAddress, [In] int socketAddressSize);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern SocketError listen([In] SafeCloseSocket socketHandle, [In] int backlog);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern SocketError ioctlsocket([In] SafeCloseSocket socketHandle, [In] int cmd, [In, Out] ref int argp);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern unsafe int recv([In] IntPtr socketHandle, [In] byte* pinnedBuffer, [In] int len, [In] SocketFlags socketFlags);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern unsafe int send([In] IntPtr socketHandle, [In] byte* pinnedBuffer, [In] int len, [In] SocketFlags socketFlags);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern SocketError shutdown([In] SafeCloseSocket socketHandle, [In] int how);
        [DllImport("ws2_32.dll", SetLastError = true)]
        internal static extern SocketError setsockopt([In] SafeCloseSocket socketHandle, [In] SocketOptionLevel optionLevel, [In] SocketOptionName optionName, [In] ref int optionValue, [In] int optionLength);
    }
    #endregion

研究了几天.net socket里对IOCP的封装,发现确实有些复杂,不打算往出拆代码了,自己理解IOCP的代码,用平台调用写一个示例吧。甭 管.net再发展,remoting,wcf啥的,底层还是有限的这么几个函数,真的推荐大家好好看看,到时候网络程序出问题了,抓dump,看调用栈也 知道到底阻塞到哪个API了,为什么会阻塞。学windbg也就是那几个命令而已,关键你还得了解clr的内部运行机理,win32api,crt,il甚至汇编 等。

本文配套源码

时间: 2024-10-23 11:30:08

c#使用winsock api实现同步Socket服务端的相关文章

java ocket 反向-java Socket服务端反向查数据

问题描述 java Socket服务端反向查数据 需求是 两个java web项目,用socket实现数据即时查询 client向server注册,并保持连接 server向client发送请求,client返回数据. 我现在不知道怎么用ServerSocket向Socket对象发送请求,并且能得到回复. 帮我考虑一下,多谢. 解决方案 http://bbs.51cto.com/thread-1084435-1.html 一个简单的Demo 解决方案二: 看一下例子就行了http://blog.

socket服务端向客户端发送字节数组消息时客户端无法接收问题

问题描述 socket服务端向客户端发送字节数组消息时客户端无法接收问题

scoket tcp ip 报文-Java 的 Socket服务端客户端以tcp/ip协议发送接收报文

问题描述 Java 的 Socket服务端客户端以tcp/ip协议发送接收报文 代码谁有模板,比如给你一个login报文,logout报文!!急急急!!! 解决方案 Android Socket 编程(WIFI 和 ADB) 有了发送数据的功能,再发送文件还需要分包等协议. 解决方案二: 这个不知道是不是你要的答案, 解决方案三: http://blog.csdn.net/u013301192/article/details/46336719 解决方案四: 网页上的1楼回复应该对你有用,祝你好运

java-JAVA Socket服务端 的到socket的连接数

问题描述 JAVA Socket服务端 的到socket的连接数 RT:怎么获取 多少个客户端连接我的服务端,求大神指教!!! 解决方案 可以用一个变量计数,没有一个客户端连接就加1. 解决方案二: 应该是服务端在接到连接的时候用一个链表把链接存储起来,然后遍历链表得到数量. 解决方案三: 创建一个连接就存到hash表里,断开连接就从hash表里删除,获取hash表的大小就是连接数 解决方案四: 做一个计数器,增加连接+1,断开连接-1 解决方案五: java Socket服务端3.java s

Android Socket服务端与客户端用字符串的方式互相传递图片的方法_Android

发送图片: 首先找到具体传递的图片: <span style="font-family: comic sans ms,sans-serif; font-size: 16px;">private Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); // 开始读入图片,此时把options.inJustDecodeBounds 设回true了

多个socket服务端,一个socket客户端在调用其中一个不通时,如何有选择的调用其它几个

问题描述 socket服务端:server1,server2,server3,server4socket客户端:client1,client2,client3,client41.client1先调server1不通,进而试着调用server2,server2不通就调server3,server3不通就调用server42.client2先调server2不通,进而试着调用server1,server1不通就调server3,server3不通就调用server43.client3先调server

请教SOCKET 服务端代码

问题描述 //监听函数publicvoidListen(){//初始化SOCKET实例newsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//初始化终结点实例localEP=newIPEndPoint(IPAddress.Any,setPort);try{//绑定newsock.Bind(localEP);//监听newsock.Listen(10);//用于设置按钮状态m_Listen

java socket 服务端:javascript 的Socket 服务端编程。

这里的Socket编程不是指使用XmlHttpRequest对象, 而是真正的创建一个Socket实现收发数据. 使用Javascript调用Java的NIO接口实现的Socket编程.实现一个简单的EchoServer,创建文件 :EchoServer.jsvar socket = __import__('Socket', null, {}) //导入Socket library..var server = new socket.SocketServer('127.0.0.1', 8000)

socket服务端必须写在wcf或winform中吗

问题描述 没做过socket,现在要做socket的服务端,我现在将代码写在web项目的类库中,不清楚socket服务是否随着web项目启动而启动,还是需要重新起一个winform或wcf项目,请指点下呀 解决方案 解决方案二:和通常的socket一样写就可以了解决方案三:需要单独写一个socket程序,可以是控制台,winform,wpf,跟wcf不是一回事.解决方案四:写个单独服务,部署在服务器.解决方案五:也可以卸载web项目的gloax文件中解决方案六:也可以windowsservice