同时在TCP和UDP之间切换

时间:2017-02-05 18:36:04

标签: c++ sockets tcp

我正在研究机器人控制项目,我应该主要(1)向机器人发送一些关于速度和固定位置的数据,然后(2)使用我的PC开始实时控制并重复。 我选择使用TCP / IP作为第一步和实时UDP / IP。 我试图对此进行编码,但我相信缺少某些东西。

我有一些问题:

1-当没有传入(客户端)连接时,accept函数没有返回有效的套接字,也没有打印消息[10] !!

2- Sendto使用相同的服务器IP和端口是否可以?

3-这是来回切换UDP和TCP的正确方法还是应该考虑一些因素?

/

1 个答案:

答案 0 :(得分:0)

  

1-当没有传入(客户端)连接接受功能时   没有返回有效的套接字,也没有打印消息[10] !!

accept()的正常行为是阻止(即不返回),直到收到传入的TCP连接或发生错误。如果你不希望accept()被阻塞,你可以将TCP_Server套接字设置为非阻塞,这样它不会阻塞它而是返回-1并将errno设置为EWOULDBLOCK。

至于消息[10]没有打印,请记住stdout / cout流是缓冲,这意味着您发送给它的任何文本实际上都不会显示在终端窗口,直到您打印换行符(&#39; \ n&#39;或std :: endl)或手动刷新流。因此,如果您没有及时看到预期的输出,您可能需要验证您的Message [10]字符串是否包含换行符,或者将<< std::endl;附加到cout << blah的末尾。 1}}来电。

  

2- Sendto使用相同的服务器IP和端口是否可以?

这个问题含糊不清 - 与服务器IP和端口相同?

如果您询问是否可以将UDP套接字发送到在accept()调用中设置的相同IP地址和端口(即代码中的Client_Address),则可以执行此操作,但它会仅当您的机器人已设置UDP套接字以绑定到UDP端口空间中的该端口号时才起作用。 (请注意,UDP套接字和TCP套接字都可以绑定到同一个端口而不会相互干扰,因为它们具有不同的端口空间,但同样的道理,您将无法看到UDP上出现TCP数据套接字,反之亦然)

  

3-这是来回切换UDP和TCP的正确方法   还是应该考虑一些因素?

看起来它可能或多或少都可以工作,虽然更健壮的设计是使用非阻塞套接字并且总是传递所有套接字(即传递给accept()的原始TCP套接字,每个选择调用的read-fd_set中,每个TCP连接由accept()和UDP套接字返回的TCP套接字,然后始终检查所有这些套接字(通过FD_ISSET()) select()返回并在其中任何一个准备好读取时适当地做出反应。这样,您的程序可以始终处理传入的TCP数据,同时处理传入的UDP数据,而不是从仅处理TCP的模式切换到仅处理UDP的模式(并忽略任何与其不对应的数据)当前模式;因为通常忽略传入的数据会导致您忽略其请求的客户端/机器人的糟糕体验。这也允许您随时接受()传入的TCP连接(因为传入的TCP连接会导致您的TCP_Server套接字选择为准备好读取,此时您可以调用accept()它再次)。