在Windows与Linux使用socket通信基础上,添加文件传输功能,需要进行简单的交互。
目录
- 程序效果
- 实现流程
- 样例代码
- 测试用例
- 参考资料
程序效果
Windows客户端可以从Linux服务器端索要文件,也可以发送文件至Linux服务器端。
代码指定两侧的接收目录分别为
“d:/download/”和“/other/download/”
实现流程
关键交互的节点主要有5个:
(1)客户端发送需要使用的功能至服务器端:“1”表示从服务器端接收文件;“2”表示发送文件至服务器端。
(2)客户端发送文件名至服务器端。
(3)服务器端返回该文件读取/写入是否成功的结果给客户端。
(4)客户端发送本端该文件写入/读取是否成功的结果给服务器端。
(5)3、4均正常的前提下,客户端发送文件/接收文件。
样例代码
下载链接:
https://download.youkuaiyun.com/download/u013025955/11076917
2.部分主要流程
(1)Windows客户端
int main(int argc, char *argv[])
{
while (1)
{
//获取用户的操作,1表示接收文件,2表示发送文件给服务器
scanf("%d", &choice);
if (choice == 1)//从服务器接收文件
{
//开始通信
send(connectSocket, "1", 1, 0);//向服务器发送一个标志,说明是要从服务器接收文件
send(connectSocket,file_name, 100, 0);
//接收服务器端响应的结果,说明在服务器端是否打开该文件成功
recv(connectSocket, &state, 1, 0);
if (state == '1')//创建成功
{
fp = fopen(strcat(directory, file_name), "wb");
if (fp == NULL)
{
send(connectSocket, "0", 1, 0);//打开文件失败,向服务器端发送标志
continue;
}
else
{
send(connectSocket, "1", 1, 0);//打开文件成功,向服务器端发送标志
接收文件...
continue;
}
}
}
else//向服务器发送一个文件
{
send(connectSocket, "2", 1, 0);//向服务器发送一个标志,说明是要向服务器发送一个文件
send(connectSocket, file_name, 100, 0);
//接收服务器端响应的结果,说明用于接收该文件的同名文件在服务器端是否创建成功
recv(connectSocket, &state, 1, 0);
if (state == '1')//服务器创建文件成功,可以接收文件
{
fp = fopen(path, "rb");
if (fp == NULL)
{
send(connectSocket, "0", 1, 0);//读取文件失败,向服务器端发送标志
continue;
}
else
{
send(connectSocket, "1", 1, 0);//读取文件成功,向服务器端发送标志
发送文件...
continue;
}
}
}
}
return 0;
}
(2)Linux服务器端
void main(int argc, char* argv[])
{
while (1)
{
//获取客户端请求的业务类型:“1”为从服务器端获取文件,“2”为发送文件至服务器端
read(newConnection, &state, 1);
if (state == '1')
{
read(newConnection, file_recvname, 100);
fp = fopen(strcat(directory_recv,file_recvname), "rb");
if (fp == NULL)
{
write(newConnection, "0", 1);//读取文件失败,向客户端发送标志
}
else
{
write(newConnection, "1", 1);//读取文件成功,向客户端发送标志
//获取客户端状况,是否成功创建文件,如果成功创建,服务器端就可以传送
read(newConnection, &state, 1);
if (state == '1')
{
发送文件...
}
}
}
else
{
read(newConnection, file_name, 100);
fp=fopen(strcat(directory,file_name), "wb");
if (fp == NULL)//服务器创建文件失败,拒绝接收客户端的文件
{
write(newConnection, "0", 1);//写入文件失败,向客户端发送标志
}
else
{
write(newConnection, "1", 1);//写入文件成功,向客户端发送标志
read(newConnection, &state, 1);
//接收客户端响应的结果,说明客户端要发送的文件是否读取成功
if (state == '1')
{
接收文件...
}
}
}
// 并关闭监听Socket,然后退出应用程序
close(newConnection);
}
close(listeningSocket);
}
测试用例
参考资料
1.TCP实现windows和linux之间文件传输
https://download.youkuaiyun.com/download/yutianzuijin/4107567
2.fopen、popen 引起 Segmentation fault
https://www.jianshu.com/p/4d877f98a8c4