windows C++使用socket发送和接收文件
2018-03-26 19:44
435 查看
如有看不懂的地方建议从这里开始 C++下TCP发送hello world的过程:https://blog.csdn.net/qq_39511059/article/details/79658841大体思路就是将文件分块,然后转化为char流传输。//server.cpp用来接受文件
//client.cpp用来发送文件
#define _CRT_SECURE_NO_WARNINGS 1 #include <winsock2.h> #include <stdio.h> #include <windows.h> #include <string.h> #pragma comment(lib,"ws2_32.lib") #include<iostream> using namespace std; struct FileName {//用来存储和传输文件名扩展名的结构体 char Fname[64]; int len; }; class FileReciever { private: int server; int client; sockaddr_in sa; sockaddr_in ca; char buff[1024]; FILE *fp; FileName fn; public: FileReciever() { server = socket(AF_INET, SOCK_STREAM, 0); client = socket(AF_INET, SOCK_STREAM, 0); } int Listen(int port) { sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(server, (sockaddr*)&sa, sizeof(sa)); listen(server, 5); int len = sizeof(ca); printf("waiting for connect\n"); client = accept(server, (sockaddr*)&ca, &len); if (client == INVALID_SOCKET) cout << "failed" << endl; return 1; } int RecieveFile(const char *path) { char p[64]; strcpy_s(p,64, path); int len = strlen(p); if (p[len - 1] != '\\') { p[len] = '\\'; len++; } recv(client, (char*)&fn, sizeof(fn),0); strcat(p, fn.Fname); long long siz; recv(client, (char*)&siz, sizeof(siz), 0); siz = siz / 1024; fp = fopen(p, "wb+"); long long int index = 0; int num; while (index<=siz) { num = recv(client, buff, 1024, 0); if (num <= 0) break; fwrite(buff, (int)num, 1, fp); index++; cout << (int)index * 100 / siz << num<<endl; } printf("seccess\n"); return 0; } }; int main() { WSADATA WSAData; WSAStartup(MAKEWORD(2, 2), &WSAData); FileReciever fr; fr.Listen(3000); char p[] = "F:\\"; fr.RecieveFile(p); system("pause"); }
//client.cpp用来发送文件
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 #define _CRT_SECURE_NO_WARNINGS 1 #include<winsock2.h> #include<stdlib.h> #include<iostream> #pragma comment(lib, "ws2_32.lib") using namespace std; struct FileName {//存储形式:"文件名.扩展名" char Fname[64]; int len; }; class FileSender { private: FILE * fp; SOCKET sock; sockaddr_in addr; FileName fn; char temp[1024]; public: FileSender() { sock = socket(AF_INET, SOCK_STREAM, 0); } int Connect(const char *ip, int port) { addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.S_un.S_addr = inet_addr(ip); if (connect(sock, (sockaddr*)&addr, sizeof(addr)) != 0) { cout << "failed.." << endl; } return 1; } int openFile(const char *path) { char name[32], ext[16]; _splitpath(path, NULL, NULL, name, ext); strcat_s(name, 32, ext); strcpy_s(fn.Fname, 32, name); fn.len = strlen(fn.Fname); fp = fopen(path, "rb"); return 0; } int SendFile(const char *path) { openFile(path); send(sock, (char*)&fn, sizeof(FileName),0); fseek(fp, 0, SEEK_END); long long siz = ftell(fp); fseek(fp, 0, SEEK_SET); send(sock, (CHAR*)&siz, sizeof(siz),0); siz = siz / 1024; long long index=0; int num; while (1) { num=fread(temp, 1, 1024, fp); if (num == 0) break; send(sock, temp, num, 0); index++; cout << (int)index*100/siz<<"%" << num << endl; } cout << "Successfully send" << endl; return 0; } }; int main() { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); char path[] = "F:\\Program Files\\newText.txt";//发送文件的路径 FileSender fs; if(fs.Connect("127.0.0.1", 3000)) fs.SendFile(path); system("pause"); }
相关文章推荐
- Java实现Socket发送和接收文件的代码
- 基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
- 使用Socket类接收和发送数据
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- c#如何使用socket发送一条记录再接收一条记录,服务器端及客户端如何编写,初学。。最好有代码,谢谢!
- Java 小例子:通过 Socket 发送和接收文件
- 17.4.2 使用DatagramSocket发送、接收数据 #知识库
- linuxC socket 发送和接收文件小例子
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- 利用java Socket发送,接收文件.
- ASP.NET--使用Socket发送和接收消息[转载]
- 在Android中使用 asmack 实现文件的接收和发送
- Java网络编程从入门到精通(13):使用Socket类接收和发送数据
- Socket 发送或接收文件
- Java实现Socket发送和接收文件的代码(java 粘包个人联系)
- Android socket 使用PrintWriter和BufferedReader发送和接收出现乱码问题解决
- Java网络编程从入门到精通(13):使用Socket类接收和发送数据
- 17.4.2 使用DatagramSocket发送、接收数据
- Java网络编程从入门到精通(13):使用Socket类接收和发送数据