21xrx.com
2025-06-25 10:31:02 Wednesday
登录
文章检索 我的文章 写文章
C++ Socket接收数据(Recv)
2023-07-10 15:24:09 深夜i     13     0
C++ Socket 接收数据 Recv

在C++中,Socket作为一种实现网络通信的工具,可以通过发送和接收数据来实现两个不同的终端之间的通信。而在Socket中实现接收数据的方法,则是使用Recv函数。

Recv函数定义如下:

int recv(int sockfd, void *buf, size_t len, int flags);

其中,sockfd表示要接收数据的Socket的文件描述符;buf表示存储接收数据的缓冲区地址;len表示要接收的数据的最大长度;flags表示接收数据的标志,一般设置为0即可。

调用Recv函数后,它会将从Socket中接收到的数据存储在buf指定的缓冲区中,并返回接收到的字节数。注意,Recv函数不保证一次性能接收到所有的数据,所以在实际使用中,一般需要多次调用Recv函数来获取完整的数据。

以下是一个使用Recv函数接收数据的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
  int sockfd;
  struct sockaddr_in server_addr;
  char buf[1024];
  // 创建Socket
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd == -1) {
    printf("创建Socket失败!\n");
    exit(1);
  }
  // 连接服务器
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr(argv[1]);
  server_addr.sin_port = htons(atoi(argv[2]));
  if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
    printf("连接服务器失败!\n");
    exit(1);
  }
  // 接收数据
  while (1) {
    int len = recv(sockfd, buf, sizeof(buf), 0);
    if (len == -1) {
      printf("接收数据失败!\n");
      exit(1);
    } else if (len == 0) {
      printf("对方已关闭连接!\n");
      break;
    } else {
      buf[len] = '\0'; // 添加字符串结束符
      printf("接收到数据:%s\n", buf);
    }
  }
  // 关闭Socket
  close(sockfd);
  return 0;
}

在该示例程序中,我们先创建了一个Socket,并与服务器建立连接,然后通过while循环不断地调用Recv函数来接收从服务器传来的数据,并将接收到的数据输出到屏幕上。当对方关闭连接后,程序会自动退出。

总之,Recv函数是Socket中接收数据的重要方法,对于编写实现网络通信的程序而言是必不可少的工具。

  
  

评论区