网络编程中的socket中关于TCP下的文件传输:EOF问题

来源:互联网 发布:chrome 执行js代码 编辑:程序博客网 时间:2024/06/18 08:07

点击打开链接

文件的传输中:文件中并不包括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 readif (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 fileFILE * fp;errno_t err;//receive data from serverprintf("input the received file position:\n");scanf_s("%s", file_name, DEFAULT_BUFLEN);err = fopen_s(&fp, file_name, "wb+"); // binary mode for readif (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);

以上思路可以进行任何文件的传输,因为是以二进制文件进行操作的,消除了文件格式的界限。

阅读全文
0 0