您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-23 11:20 706 查看
点击打开链接

文件的传输中:文件中并不包括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);


以上思路可以进行任何文件的传输,因为是以二进制文件进行操作的,消除了文件格式的界限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐