0

嗨,我有网络编程的问题。是否可以使用接收特定消息recv()并忽略同时发送的其他消息是可能的。假设服务器和客户端已经连接。

服务器.c

sprintf(client_message, "%s hello this is test message 1", packages.userName);
      write(connfd , client_message , strlen(client_message));  //Send the message back to client

   sprintf(client_message, "%s hello this is test message 2", packages.userName);
      write(connfd , client_message , strlen(client_message));  //Send the message back to client

   sprintf(client_message, "%s hello this is test message 3", packages.userName);
      write(connfd , client_message , strlen(client_message));  //Send the message back to client

client.c (但我只想收到第二条消息)

char server_reply[2000];
      int received_bytes = 0;
      int remaining_bytes = sizeof(server_reply);

      while (remaining_bytes > 0) {
          int res = recv(sockfd , &server_reply[remaining_bytes] , remaining_bytes, 0);
          if (res < 0) {
              printf("Connection lost from server...\n");
              isconnected = 0;
              close(sockfd);
              break;
          }
          received_bytes += res;
          remaining_bytes -= res;
      }

      puts(server_reply);

谁能帮忙谢谢

4

2 回答 2

0

不,recv()它本身不能进行任何类型的过滤,这是由应用程序实现的。

于 2013-10-22T14:22:58.710 回答
0

不,TCP 套接字是字节流:字节将按照发送的顺序被接收。

有一些方法可以实现你想要的。

如果发送方和接收方都在同一台机器上,那么您可以使用#include <sys/msg.h>支持消息类型/优先级的 IPC:Message Queues ( )。

您还可以创建一个包装器来读取所有已收到的消息,然后返回具有最高优先级的消息。(注意,这并不能保证消息 2 会在消息 1 之前被处理,它只保证如果消息 2 在消息 1 被处理之前到达,它会在消息 1 之前被处理。)

无论如何,您需要的一件事是协议。现在,接收者不知道一条消息在哪里结束,下一条消息从哪里开始。请记住,IP 包的概念在 TCP 级别不存在。套接字传递字节流。

套接字中有一种称为带外数据 (OOB) 的机制,它允许在正常流之外传输数据。我自己从未使用过它,但我相信您可以在互联网上找到示例。

于 2013-10-22T14:41:47.323 回答