使用C进行套接字编程的双向通信

我对套接字编程有一点疑问。 我能够将数据从客户端发送到服务器,我的服务器处理数据。 处理完的数据的o / p,我想发回给我的客户。 那么我们可以使用相同的套接字将数据“写”回客户端。 我的意思是服务器在接受连接和接收数据之前侦听端口,所以类似地,我需要让我的客户端监听其他端口(将其绑定到其他套接字)并使我的服务器连接到该套接字并将数据传回。 任何forms的例子或解释或参考将不胜感激。 非常感谢提前。

首先查看Beej的网络编程指南 。

服务器/客户端连接的基本剧本如下:

  • 服务器listen() s在固定端口上,具有给定的套接字。
  • 客户端connect() s到服务器端口; 客户端获取套接字。
  • 服务器accept()是连接, accept()返回连接的套接字。
  • (服务器继续使用原始套接字侦听原始端口。)

对于与客户端的特定连接,服务器write() s到accept()接收传入连接时获得的新套接字。 繁忙的服务器将有许多很多套接字,但它只需要bind()到一个端口。 所有连接都进入该端口,但OS的网络协议栈将数据分开并使其在特定于连接的套接字上可用。

您不需要新的套接字。

套接字是双向连接,您可以在两个方向上发送数据,甚至可以从一个方向关闭套接字(不想再写)但仍然从另一个方向发送数据。

您的套接字是双向的,因此无需创建另一个套接字。 除非您使用某种中间件,例如Pub / Sub,否则无需创建另一个套接字来启用双向通信。

从技术上讲,它是正确的,套接字是双工的,您可以将数据发送到您读取的同一个套接字:

  SOCKET s = socket() ... //Connect int size = receive(s,...); //make response send(s, ...); 

但在实践中,这取决于你打算做什么。 如果您遇到以下情况,可以挂出套接字:

  1. 进程1通过一个发送操作在套接字上发送非常大的数据(<100K)

  2. 过程2逐个接收数据并将小数据包发送到1(~20b)。 它不是

    确认,但一些外部事件。 情况进入video群聊,2的发送缓冲区已满,并且它停止向1发送确认.2和1挂起在他们的发送操作中导致死锁。 在这种情况下,我建议使用两个sockets。 一个用于读取,一个用于写入。

(迟到的答案,主要是为了到这里寻求帮助的其他人)

我最近提出了一个示例客户端/服务器应用程序,它紧跟Beej的网络编程指南(Kerrek SB在他的回答中也推荐)。 如果您正在寻找一个简单的客户端/服务器通信工作示例,这可能会有所帮助:

https://github.com/countvajhula/dummyclientserver

特别是,不,您的客户端不需要设置单独的侦听套接字来从服务器接收数据 – 在服务器接受来自客户端的连接之后,服务器可以简单地将数据发送回同一套接字上的客户端。