【问题标题】:How can I send and recv from the same socket?如何从同一个套接字发送和接收?
【发布时间】:2013-07-17 06:35:14
【问题描述】:

我正在阅读 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 和使用目标信息进行 connect()。最后我使用了两个socket,并在setsockopt()的帮助下将它们绑定到同一个端口,但是我想知道是否有更好或更有效的方法。

【问题讨论】:

  • recv(new_fd, buffer, buffer_size, 0);
  • 凯西说得对,你不需要把客户端变成服务器(绑定它),只要让它recv()传入数据包即可。
  • 套接字有双向通信。连接稳定后,无论客户端或服务器哪个对等方,您都可以使用send()recv()

标签: c sockets


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 2021-07-08
      • 2015-11-22
      • 2016-07-28
      • 1970-01-01
      • 2010-11-14
      • 2011-07-11
      • 2014-11-25
      相关资源
      最近更新 更多