c++ socket 传输图像
时间: 2023-07-23 10:38:23 浏览: 188
要在C++中传输图像,可以使用Socket编程。以下是一些基本步骤:
1. 在发送端,将图像读取到内存中,并将其转换为字节数组。
2. 将字节数组发送到接收端,可以使用TCP或UDP协议。如果使用TCP协议,则可以使用套接字中的send()函数发送数据。如果使用UDP协议,则可以使用sendto()函数。
3. 在接收端,接收到字节数组后,将其转换回图像格式,并保存到文件系统中。
这里是一个简单的示例代码,用于在两个计算机之间传输图像:
发送端代码:
```
#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
int main()
{
// 创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
cerr << "Error creating socket" << endl;
return -1;
}
// 设置服务器地址和端口号
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345);
serverAddr.sin_addr.s_addr = inet_addr("192.168.1.100");
// 连接服务器
if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
cerr << "Error connecting to server" << endl;
return -1;
}
// 读取图像到内存中
ifstream file("image.jpg", ios::binary | ios::ate);
streamsize size = file.tellg();
file.seekg(0, ios::beg);
char* buffer = new char[size];
if (file.read(buffer, size)) {
cout << "Image loaded into memory" << endl;
}
// 发送数据
if (send(sock, buffer, size, 0) < 0) {
cerr << "Error sending data" << endl;
return -1;
}
// 关闭套接字
close(sock);
delete[] buffer;
return 0;
}
```
接收端代码:
```
#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;
int main()
{
// 创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
cerr << "Error creating socket" << endl;
return -1;
}
// 绑定端口号和地址
struct sockaddr_in serverAddr, clientAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345);
serverAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
cerr << "Error binding socket" << endl;
return -1;
}
// 监听套接字
listen(sock, 1);
// 接受连接
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSock = accept(sock, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (clientSock < 0) {
cerr << "Error accepting connection" << endl;
return -1;
}
// 接收数据
char buffer[1024];
int bytesRead = recv(clientSock, buffer, sizeof(buffer), 0);
if (bytesRead < 0) {
cerr << "Error receiving data" << endl;
return -1;
}
// 将字节数组转换为图像格式
ofstream file("image.jpg", ios::binary);
file.write(buffer, bytesRead);
cout << "Image saved to disk" << endl;
// 关闭套接字
close(clientSock);
close(sock);
return 0;
}
```
注意:这只是一个简单的示例代码,需要根据实际情况进行修改和完善。例如,可以增加错误处理和数据校验等功能,以确保数据的完整性和正确性。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)