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

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

问题描述:

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

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

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

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

问题1) 服务器如何向客户端发送命令?我必须创建使端口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个命令。

谢谢,我是新来的这个网络应用程序,所以任何帮助,非常感谢。

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

+1

是的,只有一个进程可以同时绑定和侦听TCP地址+端口。那么你有两个想要交换数据的程序?除非我错过了任何东西,否则您可以使用一个套接字并双向发送数据。 – IanNorton 2011-05-05 19:06:13

+0

你能说出你有什么协议吗?如果这确实是TCP,那么你不需要发送和接收ACK消息。 – IanNorton 2011-05-05 19:09:32

+0

如果打开TCP/IP网络套接字,则不需要关闭连接,请将其保持打开状态。服务器和客户端可以互相发送消息。你提到ACK,你会写一个HL7接口吗? – 2011-05-05 19:09:36

通常的方法如下:

  1. “服务器”套接字绑定到指定的端口 - 这看起来会是10015为您服务。
  2. “客户机”用于其传出传输的ephemeral port
  3. 如果服务器向客户端作出响应,它发送一个消息从它绑定端口(10015)到消息#2的源端口,临时端口。

在服务器上:

如果使用的是UDP,你可以简单的拷贝一个recvfrom的()为您传递到的sendto()的sockaddr结构体中设置的sockaddr结构体。

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

我最喜欢的C Sockets参考是免费的,可在线使用Beej's Guide to Network Programming

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

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

问题2的答案是......你使用UDP。你必须明确地发回一些东西。您应该在服务器中使用recvfrom();为向何处发送ACK信息被存储在你通过struct sockaddr *src_addr重新阅读后

编辑:如果你还没有尝试使用UDP ......你只是与客户端连接到服务器并在套接字之间来回通信。你的客户不听任何东西。教程here应该有所帮助。

这样做

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

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

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

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

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


1.实际上,这不是真的 - 它们可以,但是每个传入的连接只能被其中一个接受。这不是你想要的。

+0

',也可以防止......'不,不。 – EJP 2011-05-06 12:38:39

+0

@EJP:当然可以 - 如果客户端在收到对其命令的响应后立即关闭套接字,那么稍后服务器要发送命令时不会打开套接字。 – caf 2011-05-06 12:44:22