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 は毎回 1 秒ほどでデバイスがあると報告します。.NET バージョンのポートのバイト オーダーを 56067 に逆にしてみましたが、どちらも機能しませんでした。私は何が欠けていますか?.NET は 0.0.0.0 のリモート エンドポイントを受け入れないようです...