21xrx.com
2024-09-19 10:07:42 Thursday
登录
文章检索 我的文章 写文章
使用UDP传输图片的C++程序
2023-06-22 08:00:03 深夜i     --     --
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++程序,通过该程序可以在不牺牲速度的情况下实现快速传输图片。通过对程序的理解和改进,我们可以根据自己的需求,进行更多高效的数据传输。

  
  

评论区

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