【小练习】windows与linux进行socket文件传输

在Windows与Linux使用socket通信基础上,添加文件传输功能,需要进行简单的交互。

目录

  • 程序效果
  • 实现流程
  • 样例代码
  • 测试用例
  • 参考资料

程序效果

【小练习】windows与linux进行socket文件传输

Windows客户端可以从Linux服务器端索要文件,也可以发送文件至Linux服务器端。

代码指定两侧的接收目录分别为

“d:/download/”和“/other/download/”

实现流程

【小练习】windows与linux进行socket文件传输

关键交互的节点主要有5个:

(1)客户端发送需要使用的功能至服务器端:“1”表示从服务器端接收文件;“2”表示发送文件至服务器端。

(2)客户端发送文件名至服务器端。

(3)服务器端返回该文件读取/写入是否成功的结果给客户端。

(4)客户端发送本端该文件写入/读取是否成功的结果给服务器端。

(5)3、4均正常的前提下,客户端发送文件/接收文件。

样例代码

下载链接:

https://download.****.net/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);
}

测试用例

【小练习】windows与linux进行socket文件传输

参考资料

1.TCP实现windows和linux之间文件传输

https://download.****.net/download/yutianzuijin/4107567

2.fopen、popen 引起 Segmentation fault

https://www.jianshu.com/p/4d877f98a8c4