接收特定的消息套接字编程C.

时间:2013-10-22 14:10:22

标签: c sockets network-programming send recv

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

server.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);

任何人都可以帮助,谢谢你

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

不,TCP套接字是一个字节流:字节将按发送顺序接收。

有很多方法可以达到你想要的效果。

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

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

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

套接字中有一种称为带外数据(OOB)的机制,允许在普通流旁边传输数据。我自己从未使用过它,但我相信你可以在网上找到例子。