Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一台服务器多个客户端C/C++;_C++_C_Sockets_Tcp_Udp - Fatal编程技术网

C++ 一台服务器多个客户端C/C++;

C++ 一台服务器多个客户端C/C++;,c++,c,sockets,tcp,udp,C++,C,Sockets,Tcp,Udp,我知道关于这个问题有很多话题,但我需要一个关于我的情况的更详细的建议 我的体系结构由多个I/O外围设备(客户端)和一个中央单元(服务器)组成,通过局域网中的以太网连接,无需互联网连接 客户端必须向我的服务器发送数据(字节),每个外设必须发送的字节数约为20字节。 此外,我的系统应该可以正常工作,不会被中断几分钟、几小时或几天,这并不重要。 数据将每秒(或多或少)通过连接发送一次 所以,问题是:我应该使用TCP还是UDP?在这种情况下,哪一个更好 我在网上读到一些指南,可以使用“select()”

我知道关于这个问题有很多话题,但我需要一个关于我的情况的更详细的建议

我的体系结构由多个I/O外围设备(客户端)和一个中央单元(服务器)组成,通过局域网中的以太网连接,无需互联网连接

客户端必须向我的服务器发送数据(字节),每个外设必须发送的字节数约为20字节。 此外,我的系统应该可以正常工作,不会被中断几分钟、几小时或几天,这并不重要。 数据将每秒(或多或少)通过连接发送一次

所以,问题是:我应该使用TCP还是UDP?在这种情况下,哪一个更好

我在网上读到一些指南,可以使用“select()”或“fork()”。 我有一些关于多用户聊天中使用的多客户端和单服务器通信的基本程序。
我的应用程序与多用户聊天的区别在于,我应该将数据保存在服务器上的文件中。

真正的问题应该是:您需要可靠的消息传递吗?如果是,那么您应该使用TCP


TCP的开销经常被夸大。正如Jeremy在下面的评论中提到的,在“正常”情况下,您可以避免很多开销。当坏事情发生时,比如数据包丢失,您将不得不支付TCP和UDP的开销,那么为什么不免费获得一个可靠协议的工作版本呢从长远来看,这将更简单。ja_mesa描述的连接状态跟踪也正是TCP为您所做的。这叫做序列号。帮你自己一个忙,不要重新安装轮子。把时间花在重要的地方进行编码。

我有一个类似的应用程序,我使用UDP和acknowledge,它是一个服务器,可以处理数百个外围设备和时钟。我所说的承认是什么意思;每个客户端向服务器发送一个数据包,并等待确认数据包(ACK)。如果客户端没有收到ACK(在2-4秒内),它将再次发送相同的数据

为什么选择UDP:因为它比TCP更容易编程。在服务器端,您只需要一个打开的套接字,它绑定到端口并侦听传入的数据包。一旦接收到数据包,服务器就会向发送IP发送ACK数据包。客户端还应绑定到UDP端口以接收ACK数据包。这些端口号可能相同,也可能不同。例如,服务器端口可以是6050,客户端端口可以是6060,这取决于您

另一方面,如果使用TCP,则每个连接的客户端都需要一个套接字,并使用
select
poll
查看哪个客户端有挂起的数据。但在这种情况下,您不需要ACK,因为TCP是可靠的和面向连接的

使用UDP时,您可能会遇到两个问题:

  • 客户端的数据包丢失
    :这是最简单的一个,客户端从未收到ACK数据包,它将再次发送相同的数据包
  • <代码>服务器ACK包丢失:在这种情况下,客户端将再次发送相同的包,服务器已经得到了一个包,如果包复制是问题,那么您可以考虑对包进行编号,我的意思是,在客户端发送的数据中有一个表示包号的字段整数。使用此信息,服务器可以放弃重复:IP/数据包编号

  • 没有像C/C++
    fork
    select
    这样的东西是不相关的系统调用,所以说两者都可以使用是没有意义的。我知道,但我在一本指南上读到了使用多客户端通信的两种不同方式,这就是我为什么问这个问题的原因!;)是和否,所有的数据对我来说都很重要!我在想,也许我回避了问题中的一点:在速度方面,由于数据量较低(总共约50字节),TCP比UDP的延迟时间更长?TCP(设置了TCP_NODELAY标志以便禁用Nagle的算法)将为您提供与UDP相同的延迟时间,但数据包丢失的情况除外。(在这种情况下,TCP层必须返回并重新传输丢弃的数据包,然后才能发送更多的数据;而UDP将愉快地继续发送下一个数据包)由于您在LAN上,这种情况不应该经常发生,但仍然可以发生;你必须决定在这种情况下,是让丢弃的数据包重新交付更为重要,还是让下一个数据包在正常时间到达更为重要。好的,我想现在更清楚如何管理这种情况了。谢谢;)这个答案解决了我对这个问题的所有疑问。因此,这种解决方案比TCP更容易开发,但我应该面对两个失败的案例!谢谢你的回答!您真的认为重新实现TCP的可靠交付将与TCP的内置版本一样可靠吗?另外,您提到UDP更简单,因为您不需要维护单独的连接,但接下来您将描述如何在UDP中维护单独的连接以避免重复数据包。为什么不将TCP用于它的设计目的呢?您基本上已经开始在代码中重新实现它,并且可能比原始作者做得更糟。