我在套接字编程中有一个小疑问。我能够将客户端的数据发送到服务器并由服务器处理数据。我想将处理后的数据发送回客户端。因此,我是否可以使用同一套接字"write"数据返回给客户端?我的意思是,服务器在接受连接和接收数据之前侦听某个端口,那么同样地,我需要让客户端侦听其他端口(将其绑定到其他套接字),并使我的服务器连接到该套接字并将数据传输回来。任何示例、说明或参考资料都将不胜感激。非常感谢。
我在套接字编程中有一个小疑问。我能够将客户端的数据发送到服务器并由服务器处理数据。我想将处理后的数据发送回客户端。因此,我是否可以使用同一套接字"write"数据返回给客户端?我的意思是,服务器在接受连接和接收数据之前侦听某个端口,那么同样地,我需要让客户端侦听其他端口(将其绑定到其他套接字),并使我的服务器连接到该套接字并将数据传输回来。任何示例、说明或参考资料都将不胜感激。非常感谢。
首先,查看Beej的网络编程指南。
服务器/客户端连接的基本流程如下:
listen()
监听。connect()
连接到服务器端口;客户端获得一个套接字。accept()
接受连接,并返回一个用于连接的新套接字。对于与客户端的特定连接,服务器将使用在接受传入连接时获取的新套接字进行write()
。一个繁忙的服务器将拥有许多套接字,但它只需要bind()
到一个端口上。所有连接都进入该端口,但操作系统的网络协议栈会将数据分离并在连接特定的套接字上可用。
accept()
返回 一个新的套接字以进行连接。 - Karoly Horvath你不需要一个新的套接字。
套接字是一种双工连接,您可以在两个方向发送数据,甚至可以从一个方向关闭套接字(不想再写了),但仍然可以从另一个方向发送数据。
从技术上来说,这是正确的,socket是双工的,你可以将数据发送到你读取数据的同一个socket:
SOCKET s = socket()
... //Connect
int size = receive(s,...);
//make response
send(s, ...);
但是在实践中,这取决于你要做什么。如果你遇到以下情况,就可能会挂起套接字:
进程1通过一个发送操作向套接字发送非常大的数据(<100K)
进程2通过分部接收来自1的数据,并向1发送小数据包(〜20b)。 它不是确认,而是一些外部事件。 情况进入挂起状态,2的发送缓冲区已满,并停止向1发送确认。 2和1在其发送操作中挂起,形成死锁。 在这种情况下,我建议使用两个套接字。一个用于读取,另一个用于写入。
您的套接字是双向的,因此无需创建另一个套接字。除非您使用某种中间件,例如Pub/Sub,否则无需创建另一个套接字以实现双向通信。