Socket编程实现文件的传输II(封装)

来源:互联网 发布:淘宝网秋装新款风衣 编辑:程序博客网 时间:2024/05/21 06:02

客户端执行方式:
./a.out src ip port
其中src和之前一样,都是代表要进行读写的文件,ip表示ip地址,port表示端口号;在客户端中ip接口和port接口稍微进行了封装,这样操作起来比较方便;

公用接口:

/************************************************************************* * File Name: network.h * Author:    The answer * Function:  Other         * Mail:      2412799512@qq.com  * Created Time: 2017年06月15日 星期四 20时33分53秒 ************************************************************************/#ifndef _NETWORK_H#define _NETWORK_H#include<sys/socket.h>#include<sys/types.h>#include<sys/stat.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<errno.h>#include<stdlib.h>#include<stdio.h>int _server(uint16_t port,const char *ip);int _accept(int server,struct sockaddr *addr,socklen_t *len);/* */int _read(int fd,char *buf,int len);/**/int _Read(int fd,char *buf,int len);int _write(int fd,char *buf,int len);#endif
/************************************************************************* * File Name: network.c * Author:    The answer * Function:  Other         * Mail:      2412799512@qq.com  * Created Time: 2017年06月15日 星期四 20时33分53秒 ************************************************************************/#include "network.h"int _server(uint16_t port,const char *ip){    int sockfd;    struct sockaddr_in addr;    bzero(&addr,sizeof(addr));    sockfd = socket(AF_INET,SOCK_STREAM,0);    if(sockfd < 0)    {        perror("socket");        close(sockfd);        return -1;    }    addr.sin_family = AF_INET;    addr.sin_port = htons(port);    addr.sin_addr.s_addr = inet_addr(ip);    if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)    {        perror("bind");        return -2;    }    if(listen(sockfd,128) <  0)    {        perror("listen");        return -3;    }    return sockfd;}int _accept(int server,struct sockaddr *addr,socklen_t *len){    while(1)    {        int sockfd = accept(server,addr,len);            if(sockfd < 0)            {                if(errno == EINTR)                    continue;                else                {                    perror("accept");                    break;                }            }        return sockfd;    }    return -1;}/* 提供多少读多少 */int _read(int fd,char *buf,int len){    int readlen = 0;    while(readlen != len)    {        int ret = read(fd,buf+readlen,len-readlen);        if(ret > 0)            readlen += ret;        else if(ret < 0)        {            if(errno == EINTR)                continue;            else                break;        }else if(ret == 0)            break; //表示已经读完全部数据    }    //返回实际读到的数据    return readlen;}/*_Read函数返回实际读到字节 */int _Read(int fd,char *buf,int len){    int ret = -1;    while(1)    {        ret = read(fd,buf,len);        if(ret == -1 && errno == EINTR)            continue;        else            return;    }    return ret;}int _write(int fd,char *buf,int len){    int writelen = 0;    while(writelen != len)    {        int ret = write(fd,buf+writelen,len-writelen);        if(ret > 0)            writelen += ret;        else if(ret < 0)        {            if(errno == EINTR)                continue;            else                break;         }    }    return writelen; }

服务端程序:

/*************************************************************************    * File Name: server.c    * Author:    The answer  * Function:  Other            * Mail:      2412799512@qq.com     * Created Time: 2017年06月15日 星期四 20时50分53秒 ************************************************************************/#include "network.h"int main(int argc,char **argv) {    int sockfd = _server(8888,"127.0.0.1");    if(sockfd < 0)    {        printf("create server failure.\n");        return -1;    }    while(1)    {        int accefd  = _accept(sockfd,NULL,NULL);        if(accefd < 0)        {            printf("accept failure.\n");            return -2;        }        int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC,0777);        if(fd < 0)        {            printf("open failure.\n");            return -3;        }        char buf[4096];        while(1)        {            int ret = _Read(accefd,buf,sizeof(buf));            if(ret > 0)                write(fd,buf,ret);            else                 break;        }        close(accefd);        close(fd);    }    close(sockfd);    return 0; }

客户端程序:

/*************************************************************************    * File Name: client.c    * Author:    The answer  * Function:  Other            * Mail:      2412799512@qq.com     * Created Time: 2017年06月15日 星期四 21时42分19秒 ************************************************************************/#include "network.h"void sys_err(const char *ptr,int num){    perror(ptr);    exit(-1);}int main(int argc,char **argv) {    int sockfd;    struct sockaddr_in addr;    const char *src = argv[1];    const char *ip = argv[2];    const char *port = argv[3];    if(argc != 4)    {        printf("Usage:./filename src ip port");        return -1;    }    sockfd = socket(AF_INET,SOCK_STREAM,0);    if(sockfd < 0 )    {        sys_err("socket",-1);    }    bzero(&addr,sizeof(addr));    addr.sin_family = AF_INET;    addr.sin_port = htons(atoi(port));    addr.sin_addr.s_addr = inet_addr(ip);    if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0)    {        sys_err("connect",-2);    }    int fd = open(src,O_RDONLY);    if(fd < 0)    {        sys_err("open",-3);    }    char buf[1024];    memset(buf,0x00,sizeof(buf));    while(1)    {        int ret = read(fd,buf,sizeof(buf));        if(ret == 0)            break;        _write(sockfd,buf,ret);    }    close(fd);    close(sockfd); }

这里写了一个make.sh脚本,里面的内容是:

########################################################################## File Name: make.sh# Author: lixiaogang# mail: 2412799512@qq.com# Created Time: 2017年06月15日 星期四 21时37分00秒##########################################################################!/bin/bash gcc server.c network.c -o servergcc client.c network.c -o client

这样编译将变得方便许多;该程序实现的功能和版本I的文件传输功能一样;

阅读全文
0 0
原创粉丝点击