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
- Socket编程实现文件的传输II(封装)
- Socket编程实现文件的传输
- Windows Socket编程之TCP实现大文件的传输
- Windows Socket编程之UDP实现大文件的传输
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1[使用IE浏览本页]
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2[使用IE浏览本页]
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]
- Socket编程(一)TCP传输文件
- 使用Socket实现文件的传输
- Java实现 Windows Socket编程 UDP实现大文件的传输
- socket网络编程实现文件从服务器端到客户端的传输
- Java实现 Windows Socket TCP实现大文件的传输
- python socket编程(传输字符、文件、图片)
- c++ 应用socket实现C/S端文件的传输
- 请帮忙~~各位大哥,C#编程 用socket套接字实现文件和文字的传输 怎么编写??????
- [转帖]socket 网络编程 点对点传输文件
- VC++使用Socket网络编程传输文件
- Visual Studio 2015中ucrtbased.dll丢失
- python3安装.whl文件
- 数据库SQL去重,保留一条数据
- Maven日常使用总结
- 一个页面从输入URL到页面加载显示完成,这个过程发生了什么?
- Socket编程实现文件的传输II(封装)
- 使用Phaser框架构建你的第一个H5游戏
- Mongodb 启动命令(第一次写博客,是这样的么?)
- 记一次接口解密失败过程的沉痛教训
- POJ 1812 Zuma Game 笔记
- 主题五 内存管理的艺术----30.内存中的三雄并立
- 单片机学习路线
- 云技术入门介绍
- 美元霸权·《看懂世界格局的第一本书·2》