我有一些使用插槽制作多人回合制游戏的经验,但我从未尝试过实时Action游戏。我需要处理什么样的额外问题?我是否需要保留玩家行为的历史记录,以防落后的玩家过去做过某事?我真的需要使用UDP数据包还是TCP就足够了?还有什么?我还没有真正决定要做什么,但是为了这个问题的目的,你可以考虑一个10人的2D游戏,XY运动。 最佳答案 “客户端服务器”或“点对点”或介于两者之间的东西:哪台计算机有权决定哪些游戏操作。对于回合制游戏,通常很容易只说“服务器拥有最终权限,我们就完成了”。对于实时游戏,通常该设计是一个很好的起点,但一旦您添加延迟,
以下上下文中的“消息边界”是什么?OnedifferencebetweenTCPandUDPisthatUDPpreservesmessageboundaries.我了解TCP和UDP之间的区别,但不确定“消息边界”的定义。由于UDP在每个单独的数据包中包含目的地和端口信息,是否可以为消息提供“边界”? 最佳答案 不,消息边界与目的地或端口无关。“消息边界”是通过协议(protocol)发送的两条消息之间的分隔。UDP保留消息边界。如果您通过UDP发送“FOO”,然后发送“BAR”,另一端将收到两个数据报,一个包含“FOO”,另一个
我正在开发一款游戏,听说UDP更适合实时游戏。我知道socket.io使用TCP,想知道是否有某种方法可以将其切换为UDP。我尝试查找它,但只找到了2012年左右的帖子,其中说UDP仅在浏览器中处于试验阶段。 最佳答案 在标准浏览器中,这是不可能的。从浏览器客户端,socket.io使用http或webSocket传输。http和webSocket都是TCP连接,不是UDP连接。所以浏览器客户端socket.io不使用UDP——它使用TCP。据我所知,在可从常规HTML页面Javascript访问的浏览器中没有标准的UDP支持,因此
我有一个事件驱动的网络服务器程序。该程序接受来自其他主机上其他进程的连接。同一远程IP上的不同端口可能有许多短暂的连接。目前,我有一个while(1)调用accept()的循环然后生成一个线程来处理新连接。读取消息后关闭每个连接。在远程端,发送消息后关闭连接。我想通过缓存打开的套接字FD来消除建立和拆除连接的开销。在发件人方面,这很简单-我只是不关闭连接,并保持它们在身边。在接收端,有点难。我知道我可以存储accept()返回的FD在结构中并使用poll()监听所有此类套接字中的消息或select(),但我想同时通过accept()监听新连接和监听所有缓存的连接。如果我使用两个线程,一
假设我非常快地将数据写入阻塞套接字[我将所有数据都存储在内存中]。进一步假设另一方读取数据的速度非常慢[比如每次读取之间sleep1秒]。在这种情况下,写作方面的预期行为是什么?写入操作会阻塞直到另一端读取足够的数据,还是会返回连接重置之类的错误? 最佳答案 对于阻塞套接字,send()调用将阻塞,直到所有数据都已复制到该连接的网络堆栈缓冲区中。它不必由另一方接收。此缓冲区的大小取决于实现。当远程端确认数据时,数据从缓冲区中清除。这是操作系统的事情,不依赖于实际读取数据的远程应用程序。此缓冲区的大小也取决于实现。当远程缓冲区已满时,
在最后一个send()之后直接close()套接字是否明智/安全?我知道即使在关闭套接字后,TCP也应该尝试传送发送缓冲区中的所有剩余数据,但我真的可以指望它吗?我正在确保我的接收缓冲区中没有剩余数据,以便在我关闭后不会发送RST。在我的例子中,关闭实际上是调用exit()之前的最后一个代码语句。即使在发送数据的进程终止后,TCP堆栈真的会继续尝试传输数据吗?这是否与在通过设置SO_LINGER调用close()之前自己等待任意超时一样可靠?也就是说,应用相同的TCP超时还是更短?毕竟,如果发送缓冲区很大且连接速度较慢,实际传输所有缓冲数据的时间可能会很长。我对收到发送的最后一个字节的
双向和全双工是不同的概念。例如,Ethernet只是半双工的,因为在特定时间,只有一台主机可以通过线路发送数据,并且它不能同时发送和接收数据。所以当我们在以太网上使用TCP时,我认为TCP只是双向或半双工的。但是here它说TCP是全双工的。为什么? 最佳答案 两者兼而有之。它是双向的,因为它可以在两个方向上发送数据,它是全双工的,因为它可以在API级别同时发送数据,而不需要线路周转。当然,在较低级别上,它可能会受到可用物理层的限制。 关于sockets-TCP是双向的还是全双工的?,我
据我所知,我可以同时使用TCPListener和Socket创建服务器,那么它们两者之间有什么区别?套接字privateSocketMainSock;MainSock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);MainSock.Bind(newIPEndPoint(IPAddress.Any,port));MainSock.Listen(500);MainSock.BeginAccept(AcceptConnections,newWrapper());TCPListenerInt32
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我将在接下来的几个月里做一些小项目,需要一些书籍(最好)或URL来学习一些基本概念。通常,一台PC或嵌入式设备(因项目而异)从外部硬件设备收集一些用户输入或数据,并将其传输到远程PC,后者将其输入数据库。后端将使用Indy套接字组件在Delphi中编
我想知道bind()在TCP中的确切功能。将本地地址“绑定(bind)”到套接字是什么意思?如果它为套接字分配一个端口号,那我们为什么不在客户端使用它呢?我知道端口是由操作系统在客户端自动分配的,但我并没有全面了解这一切是如何工作的。在bind()之后,我们进行listen()。绑定(bind)与listen()有何关系?listen()会知道bind()已经执行了吗?如果是这样,bind()做了哪些更改以使其为人所知?我的意思是,返回零对成功执行有何帮助?我已经了解了很多定义,但我无法从哪里获得所有这些的详细信息。因此,如果有人能向我解释一下,我将不胜感激。