C语言Socket图片传输中的图片保存问题

需求描述:客户端发送指定图片到服务器上,服务器保存该图片,保存名字为当前系统时间。

     实现中遇到的问题:因为在传输图片过程中,服务器需要持续性的将获得的数据保存起来,怎么保存呢?可以write到文件中,或者保存到某一个数组中?讨论前者,如果保存到文件中,那么如果客户端要发送多个图片,那每次都写入到同一个文件中了,怎么解决这个问题。

     解决方法:在传输过程中,依然先把该图片保存到某一个服务器端的临时图片文件中,当传输完了之后,把该文件中的数据复制到新的文件中即可。这样在服务器端就产生了一张新图片了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言使用Socket传输图片,可以按照以下步骤进行: 1. 打开图片文件并读取图片数据到内存。 2. 创建Socket并连接到目标主机的Socket端口。 3. 将图片数据通过Socket发送到目标主机。 4. 目标主机接收到数据后,保存图片文件。 以下是一个简单的示例代码: 发送端: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_PORT 8888 #define MAXLINE 4096 int main(int argc, char **argv) { int sockfd, n; char sendline[MAXLINE], recvline[MAXLINE]; struct sockaddr_in servaddr; if (argc != 2) { printf("usage: ./client <ipaddress>\n"); exit(0); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error\n"); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { printf("inet_pton error for %s\n", argv[1]); exit(0); } if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { printf("connect error\n"); exit(0); } char *filename = "test.jpg"; FILE *fp = fopen(filename, "rb"); if (!fp) { printf("open file error\n"); exit(0); } fseek(fp, 0, SEEK_END); int filesize = ftell(fp); fseek(fp, 0, SEEK_SET); char *imgdata = (char *)malloc(filesize); if (!imgdata) { printf("malloc error\n"); exit(0); } fread(imgdata, 1, filesize, fp); fclose(fp); n = write(sockfd, (char *)&filesize, sizeof(filesize)); n = write(sockfd, imgdata, filesize); free(imgdata); close(sockfd); return 0; } ``` 接收端: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_PORT 8888 #define MAXLINE 4096 int main(int argc, char **argv) { int listenfd, connfd, n; struct sockaddr_in servaddr, cliaddr; socklen_t clilen; char buf[MAXLINE]; char *filename = "recv.jpg"; FILE *fp; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("create socket error\n"); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERVER_PORT); if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) { printf("bind error\n"); exit(0); } if (listen(listenfd, 10) == -1) { printf("listen error\n"); exit(0); } printf("waiting for client's request...\n"); while (1) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen); printf("accept a new client: %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port); int filesize; n = read(connfd, &filesize, sizeof(filesize)); printf("image size: %d\n", filesize); fp = fopen(filename, "wb"); if (!fp) { printf("open file error\n"); exit(0); } int len = 0; while (len < filesize) { n = read(connfd, buf, MAXLINE); fwrite(buf, 1, n, fp); len += n; } fclose(fp); close(connfd); printf("received image saved as %s\n", filename); } close(listenfd); return 0; } ``` 在这个示例,我们使用TCP协议进行Socket通信,并且使用了JPEG格式的图片。注意在实际应用,需要根据具体情况选择合适的协议和编码方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值