106.TCP传文件
- 客户端
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
#pragma comment(lib,"ws2_32.lib") //定义端口
#define PORT 6666
//缓冲区大小
#define BUF_SIZE 1024
//文件名大小
#define FILENAMESIZE 512
//本地地址
#define SIP "192.168.1.108" //主函数
void main()
{
//用于初始化网络
WSADATA wsadata;
//定义版本
WORD socketversion = MAKEWORD(, );
//初始化网络
if (WSAStartup(socketversion,&wsadata)!=)
{
printf("网络初始化失败");
return;
}
//创建TCP通信
SOCKET client_socket = socket(AF_INET, SOCK_STREAM, );
//判断是否创建成功
if (client_socket==SOCKET_ERROR)
{
printf("网络创建通信socket出错");
return;
}
//设定服务器信息
SOCKADDR_IN sever_addr;
sever_addr.sin_family = AF_INET;
sever_addr.sin_addr.S_un.S_addr = inet_addr(SIP);
//设定IP,端口
sever_addr.sin_port = htons(PORT);
//连接到服务器
if (connect(client_socket, (SOCKADDR*)&sever_addr, sizeof(sever_addr)) == SOCKET_ERROR)
{
puts("连接错误");
return;
}
char filename[] = { };
//初始化
scanf("%s", filename); char buffer[] = { };
memset(buffer, , );
strcpy(buffer, filename); //传递文件名,请求下载
if (send(client_socket,buffer,,) <)//传输出错
{
puts("传输错误");
return;
} //写文件
FILE *pf= fopen(filename, "wb");
if (pf==NULL)
{
puts("文件打开失败");
return; }
else
{
memset(buffer, , );
int length = ;
printf("文件开始传输");
//不断接收
while ((length=recv(client_socket,buffer,,))>)
{
if (fwrite(buffer,sizeof(char),length,pf)<length)
{
puts("文件传输错误");
}
memset(buffer, , );
}
printf("文件传输成功");
system("pause");
system(filename);
}
//关闭文件网络,清理网络
fclose(pf);
closesocket(client_socket);
WSACleanup();
} - 服务器端
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
#pragma comment(lib,"ws2_32.lib") #define PORT 6666
#define BUF_SIZE 1024
#define FILENAMESIZE 512
#define SIP "169.254.29.232" void main()
{
//初始化服务器ip地址与端口号并定义谁可以连接
SOCKADDR_IN server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
//本地ip地址
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
WSADATA wsadata;
WORD socketversion = MAKEWORD(, );//定义版本
if (WSAStartup(socketversion, &wsadata) != )
{
printf("网络初始化失败");
return;
}
//创建
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, );//创建
if (server_socket == SOCKET_ERROR)
{
printf("网络创建通信socket出错");
return;
}
//绑定
if (SOCKET_ERROR == bind(server_socket,(SOCKADDR*) &server_addr, sizeof(server_addr)))
{
printf("bind 出错");
return;
}
//监听
if (SOCKET_ERROR == listen(server_socket,))
{
printf("listen 出错");
return;
}
//传文件 while ()
{
printf("进入listen,开始等待客户端");
//客户端地址
SOCKADDR_IN client_addr;
int clientlength = sizeof(client_addr);
//接收连接
SOCKET new_socket = accept(server_socket, (SOCKADDR*)&client_addr, &clientlength);
if (SOCKET_ERROR == new_socket)
{
printf("服务器已经满或者链接失败");
break;
}
char buffer[] = { };
char filename[] = { };
//接收信息
if (recv(new_socket,buffer,,)<)
{
printf("收取文件名失败");
break;
}
strcpy(filename, buffer); //以二进制方式读取
FILE *pf = fopen(filename, "rb");
if (pf == NULL)
{
printf("文件打开失败");
break;
}
else
{
memset(buffer, , );//清零
int recelength = ;
while ((recelength = fread(buffer, sizeof(char), , pf)>))
{
if (send(new_socket,buffer,,)<)
{
printf("文件传输失败");
break;
}
memset(buffer, , );//清零
}
fclose(pf);
printf("传输完成"); } closesocket(new_socket);
}
closesocket(server_socket);
system("pause");
WSACleanup();
}
106.TCP传文件的更多相关文章
- C++中使用TCP传文件
在两个文件中都定义文件头和用到的宏: #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead { ]; int size; }; 在客户端发 ...
- java 26 - 9 网络编程之 TCP协议多用户上传文件
TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...
- day29 8_8 TCP上传文件socketserver的应用
一.文件上传 对于一些比较大的文件,当传输的数据大于内存时,显然,一次性将数据读取到内存中,在从内存传输到服务器显然时不可取的. 所以,在上传文件时,可以在with open打开文件,边读取文件边发送 ...
- TCP通信---文件上传案例、多线程文件上传
目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现. TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件 代码实 ...
- 那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 客户端上传文件到服务器端服务器端返回上传成功消息
多线程开启, 客户端通过 Socket 流 上传文件到服务端的一个小程序练习. 1. 抓住阻塞式方法,去调试 2. 获取对应流对象操作对应的对象 这时候自己不能懵,一定要清晰,最好命名就能区别,一搞混 ...
- java 利用TCP上传文件
从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io. ...
- 通过HTTP协议上传文件
HTTP是很常见的协议,虽然用得很多,但对细节的了解却是很浅,这回通过向服务端上传文件信息来理解细节.网络库的选择:1.WinHTTP是windows下常用的库:2.CURL是广受喜爱的开源 ...
- 使用Servlet上传文件
使用浏览器向服务器上传文件其本质是打开了一个长连接并通过TCP方式传输数据.而需要的动作是客户端在表单中使用file域,并指定该file域的name值,然后在form中设定enctype的值为mult ...
- 记一次FTP上传文件总是超时的解决过程
好久没写博,还是重拾记录一下吧. 背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有SSH功能的,后来发现不是这样样子啊,云虚拟机就是FTP上传网页+MySQ ...
随机推荐
- Snort企业部署实战
Snort企业部署实战 1 背景 我们知道企业网络目前威胁来自两个位置:一个是内部,一个是外部.来自外部的威胁都能被防火墙所阻止,但内部攻击都不好防范.因为公司内部人员对系统了解很深且有合 ...
- 昼猫笔记 -- 面向对象(II) - 继承
继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...
- 洛谷 P2309 loidc,卖卖萌
P2309 loidc,卖卖萌 题目背景 Loidc萌萌哒. 他最近一直在靠卖萌追求他的真爱——vivym,经过几轮攻势后vivym酱眼看就要被他所攻略.擅长数据结构的vivym决定利用强大的数据结构 ...
- 上下文切换查看 & sar
怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b.sar -u和 sar-d来看 sar –W 查看页面交换发生状况 [root@localhost ~] ...
- [Python] Check for None (Null) in Python
If you’ve used other programming languages, you may have learned that an empty object is not the sam ...
- KETTLE使用javascript步骤过滤特殊字符
KETTLE使用javascript步骤过滤特殊字符 使用kettle在抽取大量excel数据时.总是遇到excel中有一些特殊字符,导致ExecuteSQL script步骤运行失败,本文记录一些方 ...
- 绕过open_basedir读文件脚本
绕过open_basedir读文件脚本 2016年11月13日 01:28:21 阅读数:1221 参加了一场2016年的sycsec感觉又学到不少东西 废话不多说,首先啥是open_basedir? ...
- 关于ajax访问express服务器的跨域问题
在学习es6的时候用promise封装了一个ajax <script type="text/javascript"> function getNews(URL) { l ...
- Sparse Autoencoder(二)
Gradient checking and advanced optimization In this section, we describe a method for numerically ch ...
- Ubuntu+PyQt5+Python3.6+Qt Designer 实现可视化窗口的编辑
一.为什么写这片博文 近期将实验室的电脑的OS换成了ubuntu,想对linux进一步的了解和使用.在使用的过程中想用python+pyqt5写一个音乐播放器和视频播放器(这也是linux的乐趣所在) ...