C语言socket传图片并结束标志

时间: 2023-12-15 22:05:35 浏览: 33
以下是一个示例代码,演示了如何使用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大小的数据,直到读取完整个文件。同时,我们也需要在传输完成后发送一个结束标志,以便服务器端知道何时停止接收数据。

相关推荐

最新推荐

recommend-type

如何在C语言中判断socket是否已经断开

如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。小编今天跟大家简单介绍下如何在C语言中判断socket是否已经断开
recommend-type

如何基于C语言socket编程实现TCP通信

本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
recommend-type

C语言实现Linux下的socket文件传输实例

主要介绍了C语言实现Linux下的socket文件传输的方法,较为详细的分析了C语言文件Socket文件传输客户端与服务器端相关实现技巧,需要的朋友可以参考下
recommend-type

socket多人聊天程序C语言版(一)

主要为大家详细介绍了socket多人聊天程序C语言版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C语言实现socket简单通信实例

主要介绍了C语言实现socket简单通信的方法,是学习C语言网络编程非常基础而又实用的实例,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。