TCP文件发送
发送端(客户端)
#include <iostream>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <fstream>
using namespace std; #pragma comment(lib, "ws2_32.lib") struct FileHeader
{ char m_szFileName[MAX_PATH];//windows下,全文件名的字符长度是有限制的,众所周知,是MAX_PATH,260
int m_nFileSize; }; int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) { printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != ) { printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sockClient)
{
WSACleanup();
return ;
}
cout<<"请输入服务器iP"<<endl;
char szip[] = {};
cin>>szip;
sockaddr_in addr; addr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); addr.sin_family = AF_INET;
//addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.251");
addr.sin_port = htons(); if(SOCKET_ERROR == connect(sockClient,(const sockaddr*)&addr,sizeof(addr)))
{
WSACleanup();
closesocket(sockClient);
return ;
} char szFilePath[MAX_PATH] = {};
char *ptemp = szFilePath;
char szResult[] = {};//是,否
char szContent[] = {};//文件内容
//文件头
//文件名,文件大小
FileHeader fh;
cout<<"请输入要传输的文件"<<endl;
cin>>szFilePath; //获得文件名
while(*ptemp++ != '\0');
while(*(--ptemp) != '\\');//\\是一个字符
ptemp++; strcpy_s(fh.m_szFileName,MAX_PATH,ptemp); fstream fs;
fs.open(szFilePath,fstream::in|fstream::binary);//以二进制流的方式读入,中间是'|' fs.seekg(,fstream::end);//使文件指针偏移到末尾,用法详细可以见:
fh.m_nFileSize = fs.tellg(); //获得文件指针所在位置的文件大小
fs.seekg(,fstream::beg);//将文件指针偏移位置置回0
//发送,先发送文件的基本信息
send(sockClient,(const char*)&fh,sizeof(fh),); //等待对方回复
recv(sockClient,szResult,sizeof(szResult),); if( == strcmp(szResult,"是"))
{
//如果是肯定回复 while()
{
//读文件
fs.read(szContent,sizeof(szContent));
int nRelReadNum = fs.gcount();
if(nRelReadNum == )
{
break;
}
//发文件
send(sockClient,szContent,nRelReadNum,);
} }
//关闭文件
fs.close();
closesocket(sockClient);
WSACleanup();
system("pause");
return ;
}
接收端(服务器)
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
struct fileFifo
{
char fileName[MAX_PATH];
int fileSize;
};
int main()
{
//初始化wsa
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{ printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{ printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); SOCKET sever;
SOCKET waiter;
struct sockaddr_in severaddr;
struct sockaddr_in clientaddr;
char recvbuf[];//接受缓冲区
char sendbuf[];//发送缓冲区
//创建套接字
sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sever==INVALID_SOCKET)
{
WSACleanup();
return ;
}
/*if(sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
{
WSACleanup();
return 1;
}*/
//绑定
severaddr.sin_family=AF_INET;
severaddr.sin_port=htons();
severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); if(bind(sever,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR)
{
WSACleanup();
closesocket(sever);
return ;
}
if(listen(sever,)==SOCKET_ERROR)
{
WSACleanup();
return ;
}
printf("等待连接...\n");
int clientlen=sizeof(clientaddr);
waiter=accept(sever,(SOCKADDR*)&clientaddr,&clientlen);
if(waiter==INVALID_SOCKET)//第一个参数为监听套接字
{
printf("接受失败\n");
WSACleanup();
closesocket(sever);
return ;
}
char filePath[MAX_PATH];
char result[]={};
char context[];
fileFifo file;
fstream fs;
recv(waiter,(char *)&file,sizeof(file),);//发送的和接受的数据类型要一致 cout<<"文件大小为:"<<file.fileSize<<endl;
cout<<"请输入是否接受该文件"<<endl;
cin>>result;
int tempsize=file.fileSize; send(waiter,result,sizeof(result),); if(strcmp(result,"是")==)
{
cout<<"您要存储得路径为:"<<endl;
cin>>filePath;
strcat_s(filePath,MAX_PATH,file.fileName);
//对应路径下创建文件用于接受
fs.open(filePath,fstream::binary|fstream::out|fstream::trunc);
while(tempsize)
{
//接收文件内容
int numRecv=recv(waiter,context,sizeof(context),);
//写文件
if(numRecv>)
{
tempsize-=numRecv;
fs.write(context,numRecv);
}
}
}
fs.close();
WSACleanup();
closesocket(sever);
closesocket(waiter);
system("pause");
return ;
}
TCP文件发送的更多相关文章
- 基于TCP的大文件发送、UDP、socketserver
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- TCP大文件发送案例以及UDP介绍
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- QT TCP文件上传服务器
利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...
- 为什么TCP连接不可靠
原文链接:http://watter1985.iteye.com/blog/1924977 原文在此 这篇文章是关于TCP网络编程的一个不起眼的小问题.几乎人人都并不太明白这个问题是怎么回事.曾经我以 ...
- Windows 系统下json 格式的日志文件发送到elasticsearch
Windows 系统下json 格式的日志文件发送到elasticsearch配置 Nxlog-->logstash-->ElasticSearch Logstash https://ww ...
随机推荐
- [转载]ASP.NET中IsPostBack详解
1.IsPostBack介绍Page.IsPostBack是一个标志:当前请求是否第一次打开. 调用方法为:Page.IsPostBack或者IsPostBack或者this.IsPostBack或者 ...
- MySQL数据库----流程控制
流程控制 1.条件语句 举例一 delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THE ...
- QAQ的LIS树 QAQ的LIS树2 题解报告
这两道题实际上考试的时候是一道题OwO 太可怕了,忙了我三个多小时,写了整整7K 这个题两个询问关联性不强,所以分开来考虑 QAQ的LIS树 考虑如何用dp求解答案 设dp(v)表示v到根的修改后的序 ...
- P3294 [SCOI2016]背单词
P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...
- 20145220韩旭飞《网络对抗》实验九:web安全基础实践
基础问答 (1)SQL注入攻击原理,如何防御 原理:把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串. 防御: 利用输入规则限制进行防御,不允许特殊字符输入 (2)XSS攻击的原理,如 ...
- 20145335郝昊《网络对抗》Exp 8 Web基础
20145335郝昊<网络对抗>Exp 8 Web基础 实验内容 本实践的具体要求有: Web前端HTML:能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法, ...
- keil5配置stm32库函数开发
在将模板文件添加到工程中后, 1.点击魔术棒,选择C/C++,添加头文件的路径: 2.C/C++里面的define内填入:STM32F10X_MD,USE_STDPERIPH_DRIVER: 3.Ou ...
- Pairs Forming LCM (LCM+ 唯一分解定理)题解
Pairs Forming LCM Find the result of the following code: ; i <= n; i++ ) for( int j = i; j ...
- SpringJDBC源码分析记录
我们使用JdbcTemplate时,调用的query方法为: public <T> List<T> query(String sql, @Nullable Object[] a ...
- Unity3D学习笔记(十五):寻路系统
动画生硬切换:animation.play();//极少使用,常用融合方法 动画融合淡入:animation.CrossFade(“Idle”, 0.2f);//0.2f为与前一动画的融合百分比为20 ...