c# - 将 Windows 套接字转换为 .NET

标签 c# sockets

我有一个非常简单的套接字连接,它似乎在 WinSock 2.0 下工作,但在 .NET 下根本不工作。我唯一知道的是一个有效,另一个根本无效,但我不确定如何调试它。

Windows 套接字版本:

INT_PTR CALLBACK ConnectDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    SOCKET ConnectMe;
    int Status, cRemoteAddr;
    LRESULT ItemData;
    SOCKADDR_IN SockAddr, RemoteAddr;
    CERDISPINFO Info;
    BOOL fReuseAddr = TRUE;

    switch (uMsg) {
    case WM_INITDIALOG :
        memset (&SockAddr, 0, sizeof(SockAddr));
        SockAddr.sin_family = AF_INET;
        SockAddr.sin_port = htons(987);
        SockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        ConnectMe = socket (AF_INET, SOCK_DGRAM, 0);
        setsockopt (ConnectMe, SOL_SOCKET, SO_REUSEADDR, (char *)&fReuseAddr, sizeof(fReuseAddr));
        bind (ConnectMe, (SOCKADDR *)&SockAddr, sizeof(SockAddr));
        WSAAsyncSelect (ConnectMe, hwndDlg, WM_CONNECT_ME, FD_READ);
        SetWindowLong (hwndDlg, GWL_USERDATA, (LONG)ConnectMe);
        return TRUE;
    case WM_CONNECT_ME :
        ConnectMe = (SOCKET)wParam;
        cRemoteAddr = sizeof(RemoteAddr);
        Status = recvfrom (ConnectMe, (char*)&Info, sizeof(Info), 0, (SOCKADDR*)&RemoteAddr, &cRemoteAddr);
        if (Status != SOCKET_ERROR)
                {
            // Convert ip addr to host order
            ItemData = ntohl(RemoteAddr.sin_addr.S_un.S_addr);
        }
        return TRUE;
    }
    return FALSE;
}

这是大致等效的 .NET 版本:

public Form1()
{
    InitializeComponent();

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified);

    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(socketEventArg_Completed);

    socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 987);
    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    socket.Bind(new IPEndPoint(IPAddress.Any, 987));
    socket.ConnectAsync(socketEventArg);
}

void socketEventArg_Completed(Object sender, SocketAsyncEventArgs e)
{
    Boolean b = true;
}

.NET 版本永远不会遇到“Boolean b = true”断点,而 C++ WinSocks 每次都会报告在一秒左右的时间内有一个设备。我什至尝试将 .NET 版本的端口中的字节顺序反转为 56067,但它也没有用。我错过了什么?看起来 .NET 不接受远程端点 0.0.0.0...

最佳答案

这解决了问题:

Form1()
{
    UdpClient client = new UdpClient(987);
    client.BeginReceive(UDPClient_Callback, client);
}

void UDPClient_Callback(IAsyncResult result)
{

}

谢谢大家的关注!

关于c# - 将 Windows 套接字转换为 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113524/

相关文章:

c# - 使用野田时间在时区之间转换

c++ - 使用 boost asio 原始套接字创建第 2 层/以太网套接字(在 C++ 中)

ios - NSStream.close() 是同步的 TCP 吗?

java - 如何从 httpclient 连接获取底层 Socket?

linux - 设计 UDP 服务器的最佳方法是什么?

c# - 在每个大小为 150 MB 的多个文本文件中搜索字符串 C#

c# - Application_Start 是否在 Web.config 文件转换之前执行?

c# - 在两个不同的类之间使用后台 worker 的进度条

c# - MVC3 中的角色管理

Java HTTP/HTTPS 代理服务器