2011-11-15 59 views
1

如何在C++ socket tcp/ip中异步发送和接收数据和确认?,我可以在我的程序中看到当发送一些145字节的数据50次时,我将收到前六个确认,因为它需要时间给予承认。我尝试等待,直到收到当前发送的数据确认信息,但这需要很长时间,我不想这样做。我想处理数据。所以我认为我会把收到在一个单独的线程。我想在发送过程中同时处理接收?所以异步接收将工作?谁能帮忙?我用来接收和发送数据的类是一个静态类。因为我需要从另外两个类中调用才能将数据发送到相同的IP和端口。如何在C++ socket tcp/ip中异步发送和接收数据和确认?

+0

什么平台?更好地使用boost:asio ... – neagoegab

+0

Windows平台。 – Ershad

+0

除非它是一个旧协议,否则在使用'SOCK_STREAM'套接字时,您确实不需要确认,因为它已内置到底层TCP协议中。我不明白在不同的线程中接收/发送会是一个问题,但我从来没有尝试过,所以我很好奇它是如何发生的。但是如果你不想等待Ack,为什么不直接发送所有的数据,等待Ack?只需将接收缓冲区设置得足够大以适应所有情况。 –

回答

1

您可以使用套接字同时在一个线程中发送数据并在另一个线程中接收数据。你不能做的事情是从不同的线程在同一个套接字上执行相同的动作(发送或接收)。

尽管如此,总是尽量避免添加新的线程,如果不必要的话。您可以使用一些套接字函数(select,WSAEventSelect),它们会在您可以在套接字上执行读取/写入时通知您。把它们放入单个线程的循环中,等待事件并处理它们 - 在同一个线程中读/写。如果您需要处理收到的数据并且需要时间,请将接收到的数据存储在与另一个数据处理线程共享的队列中。当然,请记住,您需要使此队列线程安全并同步套接字和数据处理线程。

+1

或使用完成端口... – neagoegab

+0

+1进行评论。我同意,如果需要扩展性,完成端口是最好的(如果不是唯一的话)选择。 –

0

如果在POSIX系统中,你可能会如果你的系统是不Posix的(例如窗户)需要复用系统调用,比如pollppollpselectselect

,你应该找一些类似的功能,或者使用线程。

+0

如果我把不同的线程放在一起,会发生套接字的断开,因为发送和接收都将使用相同的套接字。 – Ershad

+0

如果你想在*相同的机器上的不同线程之间进行通信,TCP/IP是过度杀伤。 (在Linux上,管道或AF_UNIX套接字速度更快)。 –