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

linux 实现TCP 传输文件。

2015-12-16 14:10 681 查看
在学习unix网络编程时,想自己实现linux传输文件,不能用read ,write,等底层IO借口,要用fread,fwrite(把文件转成二进制流的方式),才保证文件的正确传输,不会出现粘性文件。直接上代码了。

先服务端输入接受文件名,

然后在客户端输入发送文件名。

基于unix网络编程的第三版源码

留个小问题,子程序是会变成僵尸进程的哦,解决方法,unix网络编程这本书有讲。

服务端:

#include "unp.h"

#define BUFSIZE 20

#define FILE_BUFSIZE 1024

int main(int argv, char * argc)

{

    int listen_fd,conn_fd;

    pid_t childpid;

    socklen_t clilen;

    struct sockaddr_in cliaddr, servaddr;

    bzero(&servaddr, sizeof(servaddr));

    bzero(&cliaddr, sizeof(servaddr));

    listen_fd = Socket(AF_INET, SOCK_STREAM, 0);

    

    servaddr.sin_family = AF_INET;

    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    servaddr.sin_port = htons(8000);

    

    Bind(listen_fd ,(struct sockaddr *) &servaddr, sizeof(servaddr));

    Listen(listen_fd, LISTENQ);

    while(1){

        clilen = sizeof(cliaddr);

        conn_fd = Accept(listen_fd,(struct sockaddr *) &cliaddr, &clilen);

        printf("a server up\n");

        printf("%s port: %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));

        if( (childpid = Fork() )== 0 ){

            Close(listen_fd);

            char buf[BUFSIZE];

            

            scanf("%s", buf);

            //printf("%s \n", buf);

            

            int file_fd;

            char file_buf[FILE_BUFSIZE];

            FILE *stream;

            if((stream=fopen(buf,"wb+"))==NULL)  {  

                   printf("the file was not opened\n");  

                   exit(1);  

             }  

            bzero(&file_buf, FILE_BUFSIZE);

            int ret;

            while((ret = recv(conn_fd, file_buf, FILE_BUFSIZE, 0)) > 0){

                if( fwrite(file_buf, 1, ret ,stream) <= 0){

                    break;

                    }

                bzero(&file_buf, FILE_BUFSIZE);

                }

            //Close(conn_fd);

            printf("a server down\n");

            exit(0);

            }

        

        Close(conn_fd);

        }

客户端

#include "unp.h"

#define BUFSIZE 20

#define FILE_BUFSIZE 102

#define TEST 1

int main(int argc, char ** argv)

{

    int conn_fd;

    pid_t childpid;

    struct sockaddr_in  servaddr;

    bzero(&servaddr, sizeof(servaddr));

    conn_fd = Socket(AF_INET, SOCK_STREAM, 0);

    

    servaddr.sin_family = AF_INET;

    servaddr.sin_port = htons(8000);

    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr.s_addr);

   

    Connect(conn_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    #ifdef TEST

    printf("hello inconnet\n");

    #endif

    char buf[BUFSIZE];

    scanf("%s", buf);

    //printf("%s \n", buf);

    int file_fd;

    char file_buf[FILE_BUFSIZE];

    bzero(&file_buf, FILE_BUFSIZE);

    FILE *stream;

    if((stream=fopen(buf,"rb"))==NULL){  

       printf("the file was not opened\n");  

       exit(1);  

     }

    int ret;

    while((ret = fread(file_buf, 1, FILE_BUFSIZE, stream)) > 0){

        if(send(conn_fd, file_buf, ret, 0) <= 0){

            break;

            }

        bzero(&file_buf, FILE_BUFSIZE);

    }

    printf("ok!!!!",

    fclose(stream);

    Close(conn_fd);

        
}

the end ,有什么问题请提出来哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: