C++ UDP服务器连接和发送数据异常

C++ UDP服务器连接和发送数据异常,c++,udp,winsock2,C++,Udp,Winsock2,我正在制作用于教育目的的异步(非阻塞)套接字库。TCP部分工作得很好,但当涉及到UDP时,我会遇到奇怪的行为。以下代码按预期工作-服务器接收数据: MyUDPSocket server; server.Bind(5551); MyUDPSocket client; client.Connect("192.168.0.103", 5551); Sleep(10); client.Write("\x0", 1); Sleep(10); client.Write("test", 5); 但是如果是

我正在制作用于教育目的的异步(非阻塞)套接字库。TCP部分工作得很好,但当涉及到UDP时,我会遇到奇怪的行为。以下代码按预期工作-服务器接收数据:

MyUDPSocket server;
server.Bind(5551);

MyUDPSocket client;
client.Connect("192.168.0.103", 5551);
Sleep(10);
client.Write("\x0", 1);
Sleep(10);
client.Write("test", 5);
但是如果是Sleep()或client.Write(“\x0”,1);被注释掉-它停止工作。服务器无法获取数据。以下是我的库中的一些部分,让您了解插座的具体制作方法:

s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
...............................................
memset( &name, 0, sizeof(name) );
name.sin_family = AF_INET;
name.sin_port = htons( port );
hostent* hostinfo = gethostbyname( address );
name.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr;

connect(s, (sockaddr*)&name, sizeof name)
没有你看到的那么花哨。也许这是一条潜规则,需要发送一个字节的数据来初始化连接,还是什么?我真的很困惑

编辑: 按要求编写函数。name变量与上面代码为的Connect调用中设置的变量非常相同

virtual int Write( void* data, int size )
{
    return sendto(s, (const char*)data, size, 0, (sockaddr*)&name, sizeof name);
}
编辑:
同样在select()循环中,我只检查套接字是否可读。可能是由于连接被初始化导致套接字不可写吗?如果是这样的话,应该先解决睡眠问题。但是发送一个字节怎么样?

请发布你的
Write
方法的代码,可能有些地方不太正确。添加到第一篇文章中。你需要检查所有与套接字相关的函数的返回值,以获得失败的线索。除了Write,我到处都做了。选中“立即写入”,在所有情况下,它都返回写入数据的大小,因此我猜这是成功的标志?我打赌问题在于接收端。。。您如何接收NUL字符?你是如何处理的?