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

点击打开链接

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

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

你可能感兴趣的:(网络编程)