linux 实现TCP 传输文件。

来源:互联网 发布:礼服 品牌 知乎 编辑:程序博客网 时间:2024/05/14 14:15

在学习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 ,有什么问题请提出来哦


0 0
原创粉丝点击