网络编程中的socket中关于TCP下的文件传输:EOF问题
2017-11-23 11:20
706 查看
点击打开链接
文件的传输中:文件中并不包括EOF(-1)这个结束标志;恰恰它是文件FILE这个类型的下的一个结束状态,可以通过feof(),ferror()来判断出来。
所以在socket传文件中,在接收方不可能接收到-1,且ASCII码中也都是大于等于0的,不要渴望用strcmp()比较出来。
文件传输标志:1.可以通过提前发送长度。2.加上报头。3.自己约定一个结束标志(这样的面就窄了下来,自己用是可以的)
如下是我的自己约定的标志符号的方法,
(note:传输前应该采用规定好传输缓冲接收窗口)
sever端的代码:
client端的代码:
以上思路可以进行任何文件的传输,因为是以二进制文件进行操作的,消除了文件格式的界限。
文件的传输中:文件中并不包括EOF(-1)这个结束标志;恰恰它是文件FILE这个类型的下的一个结束状态,可以通过feof(),ferror()来判断出来。
所以在socket传文件中,在接收方不可能接收到-1,且ASCII码中也都是大于等于0的,不要渴望用strcmp()比较出来。
文件传输标志:1.可以通过提前发送长度。2.加上报头。3.自己约定一个结束标志(这样的面就窄了下来,自己用是可以的)
如下是我的自己约定的标志符号的方法,
(note:传输前应该采用规定好传输缓冲接收窗口)
sever端的代码:
printf("input the file you want to transfer\n");
scanf_s("%s", temp, DEFAULT_BUFLEN); FILE * fp; errno_t err; err = fopen_s(&fp, temp, "rb"); // binary mode for read if (err != 0) { printf("open file %s failed\n", temp); return -1; } memset(temp, 0, DEFAULT_BUFLEN); int length = 0; while ((length = fread(temp, sizeof(char), DEFAULT_BUFLEN, fp)) > 0) { if (send(ClientSocket, temp, length, 0) < 0) { printf("Send File: %s Failed\n"); break; } memset(temp, 0, DEFAULT_BUFLEN); } send(ClientSocket, "eof", (int)strlen("oef"), 0); fclose(fp); printf("server file transfer success\n");
client端的代码:
//create file FILE * fp; errno_t err; //receive data from server printf("input the received file position:\n"); scanf_s("%s", file_name, DEFAULT_BUFLEN); err = fopen_s(&fp, file_name, "wb+"); // binary mode for read if (err != 0) { printf("open file %s failed\n", file_name); return -1; } memset(temp, 0, DEFAULT_BUFLEN); int length = 0; while ((length = recv(ConnectSocket, temp, DEFAULT_BUFLEN, 0)) > 0) { if (strcmp(temp, "eof") == 0) { break; } if (fwrite(temp, sizeof(char), length, fp) < length) { printf("File: %s Write Failed\n", file_name); break; } memset(temp, 0, DEFAULT_BUFLEN); } printf("transmission done\n"); fclose(fp);
以上思路可以进行任何文件的传输,因为是以二进制文件进行操作的,消除了文件格式的界限。
相关文章推荐
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1[使用IE浏览本页]
- Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--前面6篇博文全部源代码下载地址
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2
- socket网络编程实现文件从服务器端到客户端的传输
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室]
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1
- Linux网络编程之使用TCP传输文件
- Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--前面6篇博文全部源代码下载地址
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]
- c# winform socket网络编程,点对点传输文件,socket文件传输,监听端口
- 黑马程序员--10.网络编程--02.【网络传输三要素在Java中的体现】【TCP和UDP概念】【Socket基本概念】
- c# winform socket网络编程,点对点传输文件,socket文件传输,监听端口
- 关于java socket 传输文件时遇到的问题
- VC++使用Socket网络编程传输文件
- 网络编程感想(一)基于socket传输延迟问题
- c# winform socket网络编程,点对点传输文件,socket文件传输,监听端口
- 关于linux下网络编程socket 转换IP问题 inet_ntoa()
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室]
- Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2[使用IE浏览本页]