我有一个非常简单的套接字连接,它似乎可以在 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 的远程端点...