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

时间:2011-07-24 23:26:48

标签: c sockets network-programming

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

5 个答案:

答案 0 :(得分:14)

首先查看Beej's Network Programming Guide

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

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

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

答案 1 :(得分:11)

您不需要新的套接字。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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

  2. 进程2从1开始接收数据并将小数据包发送到1(~20b)。它不是

    确认,但一些外部事件。 情况进入视频群聊,2的发送缓冲区已满,并停止向1发送确认。 2和1挂在他们的发送操作中造成死锁。 在这种情况下,我建议使用两个插座。一个用于读取,一个用于写入。

答案 4 :(得分:1)

(迟到的答案,主要针对来这里寻求帮助的其他人)

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

https://github.com/countvajhula/dummyclientserver

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