服务器和客户端是否可以在同一端口启动通信并发送命令?

我有一个服务器和一个客户端应用程序,我的服务器侦听端口10015和一个客户端发送命令到该端口。 目前,两者都在同一台机器上运行,但将来的目标将是在不同的机器上运行。 我现在有这部分工作。

接下来我需要做的是让我的服务器向我的客户端发送命令。 所以我想我可以重新使用我的客户端服务器上的代码来监听一个端口。

但我不确定这是做到这一点的最好方法。 build议?

当我第一次尝试这个时,我先运行我的客户端应用程序,然后将命令发送给自己。 我的服务器应用程序未能绑定到端口(我假设你只能有一个进程监听给定的端口?)

问题1)服务器如何向客户端发送命令? 我必须创build服务器 – >客户端端口10015和客户端通信—>服务器在不同的端口,如10016?

问题2)当我使用send()从客户机 – >服务器发送命令时,接收到特定命令的ACK的最佳方式是什么? 如果我不需要发送任何数据,那么当服务器接收到数据包时,是否有办法自动获取ACK?

我目前正在为每个要发送的命令执行此操作:

create socket() conenct() to socket send() packet then call recv() to receive any data then shutdown() connection and closesocket() at end 

不知道是否有更好的方法来做到这一点? 当我的应用程序忙时,我希望每秒发送1-10个命令。

谢谢,我是这个networking应用程序的新手,所以任何帮助,不胜感激。

阅读一些评论后编辑
我正在使用TCP协议。 当我说ACK时,我的意思是我只是想从另一个应用程序得到一些确认,说明这个命令已经被接收和处理了,没有错误

通常这样做的方式如下:

  1. “服务器”将一个套接字绑定到指定的端口 – 它看起来像是10015。
  2. “客户端”使用一个短暂的端口进行传出传输
  3. 如果服务器要响应客户端,则从它的绑定端口(10015)向消息#2的源端口(短暂端口)发送消息。

在服务器上:

如果使用UDP,则可以简单地将在recvfrom()期间设置的sockaddr结构复制到传递给sendto()的sockaddr结构中。

如果使用的是TCP,accept()返回的套接字文件描述符可以在send()中用于发送响应流量到客户端。

我最喜欢的C套接字参考是免费的在线Beej网络编程指南 。

你的问题意味着你正在使用UDP。 这要求客户端在端口上进行监听(相对于TCP中的套接字上的双向通信)。

你是对的,他们都不能使用同一个端口。 您需要让客户端在一个端口上进行侦听,如果服务器尝试绑定到单个机器上的相同接口,则需要另一个服务器。

问题2的答案是…你正在使用UDP。 你必须明确地发回一些东西。 你应该在服务器上使用recvfrom() 发送确认的信息存储在你传入的struct sockaddr *src_addr中。

重读后编辑:如果你不想使用UDP …你只需连接到客户端的服务器,并通过套接字来回通信。 你的客户不听任何东西。 这里的教程应该有所帮助。

只要他们在不同的主机上,他们可以在同一个端口收听。

你是正确的,两个应用程序不能同时在同一个端口上侦听同一个地址1 。 如果你希望你的客户端拥有自己的监听套接字,那么它应该使用不同的端口号 – 你对服务器的建议是10015,客户端的10016是好的。

但是,您可能不需要客户端拥有自己的侦听套接字。 TCP连接是全双工的 – 只要该连接仍处于打开状态,服务器就可以简单地向客户端发送请求,并返回到客户端用于向服务器发送请求的同一连接。

至于问题2,获得有用的ACK的最好和唯一的方法是让你的应用程序自己发送它 – 通常在它执行命令之后。

至于你现在的发送命令的方法,你为每个命令设置和拆除一个新的连接,这是非常低效的(也阻止你使用相同的连接作为从服务器到客户端的反向信道)。 相反,你应该保持连接打开,并使用它来发送多个命令。


实际上,这不是完全正确的 – 他们可以,但是每个传入的连接只能被其中一个连接。 这不是你想要的。