C语言socket传图片并结束标志
时间: 2023-12-15 09:05:35 浏览: 69
以下是一个示例代码,演示了如何使用C语言的socket传输图片,并在传输完成后发送结束标志。需要注意的是,该代码中使用了第三方库stb_image.h来读取图片文件。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include "stb_image.h"
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
char message[BUF_SIZE];
char filename[BUF_SIZE];
int file_size, read_size, total_size = 0;
char *file_data;
FILE *fp;
int i;
if (argc != 4) {
printf("Usage: %s <IP> <port> <filename>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) {
error_handling("connect() error");
}
// 读取图片文件
sprintf(filename, "%s", argv[3]);
file_data = stbi_load(filename, &file_size, NULL, NULL, 0);
if (!file_data) {
error_handling("stbi_load() error");
}
// 发送图片文件大小
sprintf(message, "%d", file_size);
write(sock, message, BUF_SIZE);
// 发送图片文件数据
while (total_size < file_size) {
read_size = file_size - total_size > BUF_SIZE ? BUF_SIZE : file_size - total_size;
memcpy(message, &file_data[total_size], read_size);
write(sock, message, read_size);
total_size += read_size;
}
// 发送结束标志
write(sock, "END", 3);
stbi_image_free(file_data);
close(sock);
return 0;
}
void error_handling(char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
```
在服务器端,我们可以使用类似以下的代码来接收图片数据并保存到文件中:
```c
// 接收图片文件大小
read(clnt_sock, message, BUF_SIZE);
file_size = atoi(message);
// 接收图片文件数据
fp = fopen("image.jpg", "wb");
while (total_size < file_size) {
read_size = file_size - total_size > BUF_SIZE ? BUF_SIZE : file_size - total_size;
read(clnt_sock, message, read_size);
fwrite(message, read_size, 1, fp);
total_size += read_size;
}
// 接收结束标志
read(clnt_sock, message, 3);
if (strncmp(message, "END", 3) != 0) {
error_handling("Invalid message");
}
fclose(fp);
```
需要注意的是,在接收图片数据时我们使用了一个循环,每次读取BUF_SIZE大小的数据,直到读取完整个文件。同时,我们也需要在传输完成后发送一个结束标志,以便服务器端知道何时停止接收数据。
阅读全文