如何从同一个套接字发送和recv?

时间:2013-07-16 22:14:42

标签: c sockets

我正在阅读Beej的指南,我想详细说明其中一个示例,一个流客户端/服务器示例。在示例中,服务器发送消息,客户端接收消息。

我想创建一个发送和接收消息的程序。在这种情况下,它将不再是服务器/客户端体系结构,因为前者服务器和客户端都将执行相同的任务。它们非常相似。

在示例中,服务器执行以下操作:

 getaddrinfo(NULL, PORT, &hints, &p);
 sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol));
 bind(sockfd, p->ai_addr, p->ai_addrlen);
 listen(sockfd, BACKLOG);
 new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
 send(new_fd, "Hello, world!", 13, 0);

为了从同一个套接字接收消息,还需要添加什么?可能吗?

我尝试了很多不起作用的东西,例如尝试使用原始的socketfd连接()并使用目标信息。最后我使用了两个套接字并在setsockopt()的帮助下将它们绑定到同一个端口,但我想知道是否有更好或更有效的方法。

2 个答案:

答案 0 :(得分:4)

您可以从任何连接的套接字sendrecv

数据流的方向与客户端/服务器关系无关。

客户端和服务器发送和接收都很常见。他们用来发送和期望答案的模式称为protocol(在应用程序定义的协议意义上)。

答案 1 :(得分:0)

他们说“你需要两个探戈”。

客户端/服务器通信(协议)也是如此。

您的问题可能源于服务器不了解您的客户端已完成发送数据但未产生回复的事实。

有几个选项可以表示通信结束,这里只举几个例子:

  • 关闭客户端的套接字输出,这将使服务器感知EOF。
  • 告诉服务器您要发送多少字节。服务器将读取该号码,然后在读取该字节数后将向您发送回复。
  • 编码一些表示请求结束的魔术字节序列。