gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:30 26 4
gpt4 key购买 nike

我有一个非常简单的套接字连接,它似乎在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com