发送端(客户端)

 #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文件发送的更多相关文章

  1. 基于TCP的大文件发送、UDP、socketserver

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  2. TCP大文件发送案例以及UDP介绍

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  3. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  4. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  7. QT TCP文件上传服务器

    利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...

  8. 为什么TCP连接不可靠

    原文链接:http://watter1985.iteye.com/blog/1924977 原文在此 这篇文章是关于TCP网络编程的一个不起眼的小问题.几乎人人都并不太明白这个问题是怎么回事.曾经我以 ...

  9. Windows 系统下json 格式的日志文件发送到elasticsearch

    Windows 系统下json 格式的日志文件发送到elasticsearch配置 Nxlog-->logstash-->ElasticSearch Logstash https://ww ...

随机推荐

  1. java,swift,oc互相转换,html5 web开发跨平台

    java,swift,oc互相转换,html5 web开发跨平台 写一个java->swift的程序,这个程序是做跨平台系统的核心部分swift和oc到java也在考虑之列Swift->J ...

  2. C/C++之单例模式实现

    /*** * 保证一个类仅有一个实例,并提供一个访问它的全局访问点 */ #include <iostream> #include <string> using namespa ...

  3. (四)github之Git的初始设置

    设置姓名与邮箱地址 这里的姓名和邮箱地址会用在git的提交日志之中,在github上公开git仓库时会随着提交日志一起公开. 有两种方式, 第一种,在git bash下设置 第二种, 通过直接编辑.g ...

  4. P1516/bzoj1477 青蛙的约会

    青蛙的约会 exgcd 根据题意列出方程: 设所用时间为T,相差R圈时相遇 (x+T*m)-(y+T*n)=R*l 移项转换,得 T*(n-m)-R*l=x-y 设a=n-m,b=l,c=x-y,x_ ...

  5. c++性能之map实现性能比较

    http://www.cnblogs.com/zhjh256/p/6346501.html讲述了基本的map操作,在测试的时候,发现map的性能极为低下,与java相比相差了接近200倍.测试的逻辑如 ...

  6. jQuery 对象

    jQuery 对象 版权声明:未经博主授权,严禁转载分享 什么是 jQuery 对象 jQuery 对象是通过 jQuery 包装 DOM 对象后产生的对象. jQuery 对象是一个类数组对象. j ...

  7. Python 自学基础(四)——time模块,random模块,sys模块,os模块,loggin模块,json模块,hashlib模块,configparser模块,pickle模块,正则

    时间模块 import time print(time.time()) # 当前时间戳 # time.sleep(1) # 时间延迟1秒 print(time.clock()) # CPU执行时间 p ...

  8. Python 技术点

    1.文件操作 1-1 遍历文件夹和文件 import os rootDir = "/path/to/root" for parent, dirnames, filenames in ...

  9. htm5之视频音频(shit IE10都不支持)

    <p style="color: red; background-color: black;"> 视频<br /> autoplay autoplay 如果 ...

  10. C++使用TinyXML

    参照一:http://qaohao.iteye.com/blog/496237 参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1 ...