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 ,有什么问题请提出来哦
先服务端输入接受文件名,
然后在客户端输入发送文件名。
基于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 ,有什么问题请提出来哦
相关文章推荐
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- 手把手带你自制Linux系统之四 添加网络功能
- Tcpdump的使用实践
- Android 网络开发框架的选择
- TCP/IP-DNS域名系统
- TCP/IP(9)-TCP协议概述
- TcpSendRcv方法笔记1
- Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
- Goole官方网络框架-Volley的使用解析Json以及加载网络图片方法
- 2015-12-15 QEMU Network Setup
- Android之ListView分页获取网路数据客户端实现(开启异步任务,获取网络数据)(三)
- [NSURLSession/Delegate]用Post方式获取网络数据并把数据显示到表格
- 网络最基本的易混淆知识
- windows下的几种通讯方式之TCP
- 开启tomcat的SSL(https)支持
- [网络管理]windows server backup
- charles中如何对https抓包
- HTTPS(SSL加密)webservice客户端访问总结
- Neural Networks for Machine Learning 课程笔记
- python requests https 访问出错