0

我正在为教育目的制作异步(非阻塞 rly)套接字库。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() 循环中,我只检查套接字是否可读。可能是由于连接被初始化而导致套接字不可写的情况吗?如果是这种情况,它应该解决 First sleep。但是那么发送一个字节呢?

4

0 回答 0