从非阻塞SDLNet_TCP_Recv多次读取

时间:2018-04-02 01:34:45

标签: c++ sockets network-programming sdl-net

在我的单线程应用中,我使用

SDLNet_CheckSockets -> SDLNet_SocketReady -> SDLNet_TCP_Recv

链以便无阻塞地接收数据包。我在调用SDLNet_TCP_Recv时使用512作为缓冲区大小。大多数时候数据包都很适合。但是,如果我一次收到几个数据包怎么办?还是大包?

  1. 我不能盲目地多次致电SDLNet_TCP_Recv,因为我不知道它是否会阻止。如果没有更多数据阻止它。如果我收到一个与我的缓冲区大小相同的数据包,那么我将不知道是否有更多的数据包在等待。
  2. 每次SDLNet_SocketReady通话后拨打SDLNet_TCP_Recv都不起作用。它仅在第一次返回true。然后它返回false,即使实际上有更多数据需要阅读(在SDLNet_TCP_Recv返回SDLNet_SocketReady时盲目地调用false来测试它。)
  3. 每次SDLNet_CheckSockets电话后拨打SDLNet_TCP_Recv对我来说都是一个非常奇怪的选择。当然这不是这样的吗?为什么每次从一个套接字读取更多字节时都必须考虑所有套接字?这破坏了我的程序的类结构,需要肮脏的黑客才能工作。
  4. 我看到的所有教程和示例都不关心套接字可以接收的数据多于缓冲区大小(通常很小)。好像没有发生。但肯定会发生这种情况,websockets可以用64位整数表示它们的大小。除非我知道必须,否则我不想分配那么多。而且,再一次,几个小包可以简单地堆叠起来。

    我该如何处理?

    因为我处理websockets,所以不能使用UDP。

0 个答案:

没有答案