2

我正在阅读 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() 的帮助下将它们绑定到同一个端口,但我想知道是否有更好或更有效的方法。

4

2 回答 2

4

你可以sendrecv从任何连接的套接字。

数据流的方向与客户端/服务器关系没有任何关系。

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

于 2013-07-16T22:25:08.053 回答
0

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

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

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

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

  • 关闭客户端的套接字输出,这将使服务器感知 EOF。
  • 告诉服务器您要发送多少字节。服务器将读取该数字,然后在读取该字节数后将向您发送回复。
  • 编写一些指示请求结束的魔术字节序列。
于 2013-07-16T22:35:14.203 回答