21xrx.com
2025-03-24 10:51:29 Monday
文章检索 我的文章 写文章
使用UDP传输图片的C++程序
2023-06-22 08:00:03 深夜i     35     0
UDP传输 图片 C++ 程序

在计算机网络通信中,UDP是一种无连接的传输协议。相对于TCP传输协议,UDP传输协议具有更小的开销,能够更快地传输数据。因此,在需要快速传输数据的场合下,UDP可以作为一种很好的选择。

本文将介绍使用UDP传输图片的C++程序。该程序包含一个发送方和一个接收方,通过UDP协议传输图片文件。

首先,在发送方,我们需要打开一个图片文件并读取其内容。可以使用C++的文件读取函数来完成此操作。在调用发送函数之前,需要设置目标IP地址和端口号。此处假设目标IP地址为localhost(即本机),端口号为50000。

接着,在发送数据之前,我们需要用一个UDP socket来初始化基础的UDP参数,包括端口号、协议类型等。初始化UDP socket后,我们可以使用sendto函数将图片文件的内容发送到接收方。

在接收方,需要定义一个UDP socket来接收发送方发送的数据,也需要设置接收方的IP地址和端口号。接收方在接收到数据后,可以使用C++的文件写入函数将接收到的数据写入到一个新的图片文件中。在本例中,新的图片文件名为receivedImage.jpg。

接收方还需要循环进行接收,因为一个UDP socket可以接收多次数据。在循环过程中,接收方需要判断是否接收到了完整的图片文件。一种方法是在发送方发送图片文件之前,先给接收方发送一个图片文件大小的信息,接收方接收到该信息后就可以知道图片文件的大小,进行完整性判断。

下面是完整的C++代码:

发送方代码:

#include <iostream>
#include <fstream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <cstring>
#include <arpa/inet.h>
#define PORT 50000
using namespace std;
int main(){
  int sock = socket(AF_INET, SOCK_DGRAM, 0);
  if(sock < 0)
    cerr << "Error: Failed to create socket." << endl;
    return -1;
  
  struct sockaddr_in server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = inet_addr("127.0.0.1");
  char buffer[1024];
  fstream imageFile("image.jpg", ios::in);
  if(!imageFile)
    cerr << "Error: Failed to open image file." << endl;
    return -1;
  
  imageFile.read(buffer, sizeof(buffer));
  int dataSize = imageFile.gcount();
  if(sendto(sock, buffer, dataSize, 0, (struct sockaddr*)&server, sizeof(server)) < 0)
    cerr << "Error: Failed to send image file." << endl;
    return -1;
  
  imageFile.close();
  close(sock);
  return 0;
}

接收方代码:

#include <iostream>
#include <fstream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <cstring>
#define PORT 50000
using namespace std;
int main(){
  int sock = socket(AF_INET, SOCK_DGRAM, 0);
  if(sock < 0)
    cerr << "Error: Failed to create socket." << endl;
    return -1;
  
  struct sockaddr_in server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  int bindResult = bind(sock, (struct sockaddr*)&server, sizeof(server));
  if(bindResult < 0){
    cerr << "Error: Failed to bind port." << endl;
    close(sock);
    return -1;
  }
  struct sockaddr_in client;
  memset(&client, 0, sizeof(client));
  socklen_t len = sizeof(client);
  char data[1024];
  int totalSize = 0;
  int recvSize = 0;
  fstream receivedFile("receivedImage.jpg", ios::out | ios::binary);
  if(!receivedFile){
    cerr << "Error: Failed to open received image file." << endl;
    close(sock);
    return -1;
  }
  while(true){
    recvSize = recvfrom(sock, data, sizeof(data), 0, (struct sockaddr*)&client, &len);
    if(recvSize < 0)
      cerr << "Error: Failed to receive data." << endl;
      break;
    
    if(recvSize == 0)
      cout << "Finish receiving data." << endl;
      break;
    
    receivedFile.write(data, recvSize);
    totalSize += recvSize;
  }
  receivedFile.close();
  close(sock);
  return 0;
}

总结:

本文介绍了使用UDP传输图片的C++程序,通过该程序可以在不牺牲速度的情况下实现快速传输图片。通过对程序的理解和改进,我们可以根据自己的需求,进行更多高效的数据传输。

  
  

评论区

请求出错了