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 ,有什么问题请提出来哦
- linux 实现TCP 传输文件。
- TCP传输文件的实现
- 使用TCP协议实现传输文件
- Java实现 Windows Socket TCP实现大文件的传输
- Tcp传输文件
- python TCP传输文件
- Tcp实现对象传输
- Linux TCP 传输协议
- 基于TCP的局域网传输文件的实现
- java实现TCP与UDP混合传输文件总结
- Windows Socket编程之TCP实现大文件的传输
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- LINUX下实现UDP传输文件
- Linux-视频监控系统(5)-TCP传输子系统实现
- iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
- 鸡汤+实践:月薪3000到月薪30000升级之路
- UIProgressView的使用
- 【C++基础02】类中不写成员函数易犯错误模型
- Reload the site when reached via browsers back button
- linux 实现TCP 传输文件。
- LIS(最长上升子序列)模板
- Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
- Java中的String类
- 【Codevs3306】水果姐逛水果街Ⅲ 树链剖分
- CSS实现鼠标滑过按钮更改按钮样式
- MySql导入导出数据库(含远程导入导出)
- leetcode Median of Two Sorted Arrays
- jmeter之如何减负-实现稳定超高并发测试(性能调优)