我对套接字编程有一点疑问。我能够将数据从客户端发送到服务器,我的服务器处理数据。处理完的数据的o / p,我想发回给我的客户。那么我们可以使用相同的套接字将数据“写”回客户端。我的意思是服务器在接受连接和接收数据之前侦听端口,所以类似地,我是否需要让我的客户端监听其他端口(将其绑定到其他插槽)并使我的服务器连接到该套接字并将数据传回。任何类型的例子或解释或参考将不胜感激。非常感谢。
答案 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通过一次发送在套接字上发送非常大的数据(<100K) 操作
进程2从1开始接收数据并将小数据包发送到1(~20b)。它不是
确认,但一些外部事件。 情况进入视频群聊,2的发送缓冲区已满,并停止向1发送确认。 2和1挂在他们的发送操作中造成死锁。 在这种情况下,我建议使用两个插座。一个用于读取,一个用于写入。
答案 4 :(得分:1)
(迟到的答案,主要针对来这里寻求帮助的其他人)
我最近提出了一个示例客户端/服务器应用程序,它紧跟Beej的网络编程指南(Kerrek SB在他的回答中也推荐)。如果您正在寻找一个简单的客户端/服务器通信工作示例,也许这会有所帮助:
https://github.com/countvajhula/dummyclientserver
特别是,不,您的客户端不需要设置单独的侦听套接字来接收来自服务器的数据 - 在服务器接受来自客户端的连接后,服务器可以简单地将数据发送回客户端同一个插座。