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 ...
随机推荐
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...
- nginx作防盗链设置
盗链是一种损害原有网站合法权益,给原网站所在服务器造成额外负担的非法行为. 盗链的实现原理: 客户端向服务器请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端. ...
- Python入门之Pycharm开发中最常用快捷键
要查阅Pycharm的快捷键,当然要看官方文档,https://www.jetbrains.com/help/pycharm/mastering-keyboard-shortcuts.html 编辑类 ...
- C# 取form表单的数据
//key代表form表单中html元素的name属性值 public static string StringForm(string key) { string result = null; res ...
- hdu Naive Operations 线段树
题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...
- 51nod 1137 矩阵乘法
基本的矩阵乘法 中间for(int j=0;i<n;i++) //这里写错了 应该是j<n 晚上果然 效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第 ...
- [JavaScript] - 7kyu
Johnny is a boy who likes to open and close lockers. He loves it so much that one day, when school w ...
- samba基本应用24-4及示例
samba smb:service message block(137/udp, 138/udp, 139/tcp, 445/tcp) 协议是:CIFS:Common Internet File Sy ...
- 【Ctsc2011】幸福路径
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2306 给定一张有向图,每个点有权值,蚂蚁从某个节点出发,初始体力值为$1$,每走一条边$体 ...
- Codeforces Beta Round #94 div2 D 优先队列
B. String time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...