21xrx.com
2024-11-08 22:30:24 Friday
登录
文章检索 我的文章 写文章
C++ Socket 传送图片教程
2023-07-05 04:37:36 深夜i     --     --
C++ Socket 传送图片 教程 网络编程

在现代社会中,图片的应用非常广泛。随着互联网的发展,人们对图片传输的要求也越来越高。因此,学会使用Socket传输图片是程序开发人员的必备技能之一。本文将介绍如何使用C++ Socket传输图片。

第一步:编写服务器端

首先,我们需要编写服务器端程序。在C++中,使用Socket传输数据需要借助于网络库。在Windows系统下,常用的网络库是Winsock库。下面的代码演示了如何使用Winsock库编写服务器端程序:


#include <winsock2.h>

#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

#define PORT 8080

#define BUF_SIZE 4096

int main()

{

  // 初始化Winsock库

  WSADATA wsaData;

  WSAStartup(MAKEWORD(2,2), &wsaData);

  // 创建套接字

  SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  // 绑定端口号和IP地址

  sockaddr_in localAddr;

  ZeroMemory(&localAddr, sizeof(localAddr));

  localAddr.sin_family = AF_INET;

  localAddr.sin_port = htons(PORT);

  localAddr.sin_addr.s_addr = INADDR_ANY;

  bind(listenSocket, (const sockaddr*)&localAddr, sizeof(localAddr));

  // 监听端口

  listen(listenSocket, 5);

  // 接受连接请求

  sockaddr_in clientAddr;

  int clientAddrLen = sizeof(clientAddr);

  SOCKET clientSocket = accept(listenSocket, (sockaddr*)&clientAddr, &clientAddrLen);

  // 发送文件

  FILE *fp = fopen("test.jpg", "rb");

  char buffer[BUF_SIZE];

  int readCnt = 0;

  while (readCnt = fread(buffer, 1, BUF_SIZE, fp)) {

    send(clientSocket, buffer, readCnt, 0);

  }

  fclose(fp);

  // 关闭套接字

  closesocket(clientSocket);

  closesocket(listenSocket);

  WSACleanup();

  return 0;

}

在上述代码中,我们使用了Socket传输文件的常用方法:先使用fopen打开待传输文件,然后循环读取和发送,直到文件末尾。一次发送的数据量不宜过大,一般约定发送4096字节的数据块。

第二步:编写客户端

接下来,我们需要编写客户端程序。客户端程序的作用是连接服务器,接收来自服务器的数据(即图片),并将数据保存为文件。下面的代码演示了如何使用Winsock库编写客户端程序:


#include <winsock2.h>

#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

#define PORT 8080

#define BUF_SIZE 4096

int main()

{

  // 初始化Winsock库

  WSADATA wsaData;

  WSAStartup(MAKEWORD(2,2), &wsaData);

  // 创建套接字

  SOCKET socketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  // 连接服务器

  sockaddr_in serverAddr;

  ZeroMemory(&serverAddr, sizeof(serverAddr));

  serverAddr.sin_family = AF_INET;

  serverAddr.sin_port = htons(PORT);

  serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  connect(socketClient, (const sockaddr*)&serverAddr, sizeof(serverAddr));

  // 接收数据

  FILE* fp = fopen("test_recv.jpg", "wb");

  char buffer[BUF_SIZE];

  int recvCnt = 0;

  while (recvCnt = recv(socketClient, buffer, BUF_SIZE, 0)) {

    fwrite(buffer, 1, recvCnt, fp);

  }

  fclose(fp);

  // 关闭套接字

  closesocket(socketClient);

  WSACleanup();

  return 0;

}

在上述代码中,我们使用了Socket传输文件的常用方法:先使用fopen打开待传输文件,然后循环接收和写入,直到接收到的数据长度为0(即文件传输完成)。

总结

使用C++ Socket传输图片的原理相对简单,只需要通过循环读取和发送的方式完成文件传输即可。但是,在实际编写程序时需要注意一些问题,如发送和接收数据长度、套接字连接状态等。本文介绍了使用Winsock库编写服务器和客户端的完整代码,读者在使用过程中可以参考。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复