客户端代码:
#include <Winsock2.h> #include <cstdio> #include <fstream> #pragma comment(lib,"ws2_32.lib") using namespace std; size_t getSize() { FILE * file; file = fopen("1.jpg", "rb"); size_t sizeOfPic; fseek(file, 0, SEEK_END); ///将文件指针移动文件结尾 sizeOfPic = ftell(file); ///求出当前文件指针距离文件开始的字节数 fclose(file); return sizeOfPic; } void main() { WSADATA wsaData; SOCKET sockClient;//客户端Socket SOCKADDR_IN addrServer;//服务端地址 WSAStartup(MAKEWORD(2, 2), &wsaData); //新建客户端socket sockClient = socket(AF_INET, SOCK_STREAM, 0); //定义要连接的服务端地址 addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址) addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000);//连接端口6000 //连接到服务端 connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //发送数据 // char message[20] = "HelloSocket!"; char recvBuf[30]; char size[20]; size_t pic_size = getSize(); itoa(pic_size, size, 10); send(sockClient, size, strlen(size) + 1, 0); recv(sockClient, recvBuf, 1024, 0); if (strcmp(recvBuf, "success!") == 0) { printf("%s\n", recvBuf); FILE * file; file = fopen("1.jpg", "rb"); char buf[1024]; while (!feof(file)) { memset(buf, 0, sizeof(buf)); size_t readlen = fread(buf, sizeof(char), sizeof(buf), file); send(sockClient, buf, readlen, 0); } fclose(file); } //关闭socket closesocket(sockClient); WSACleanup(); } 服务端代码: #include <Winsock2.h> #include <cstdio> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsaData; SOCKET sockServer; SOCKADDR_IN addrServer; SOCKET sockClient; SOCKADDR_IN addrClient; WSAStartup(MAKEWORD(2, 2), &wsaData); sockServer = socket(AF_INET, SOCK_STREAM, 0); addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY表示任何IP addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000);//绑定端口6000 bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //Listen监听端 listen(sockServer, 5);//5为等待连接数目 printf("服务器已启动:\n监听中...\n"); int len = sizeof(SOCKADDR); char sendBuf[1024];//发送至客户端的字符串 char recvBuf[1024];//接受客户端返回的字符串 char flag[30] = "success!"; //会阻塞进程,直到有客户端连接上来为止 sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len); //接收并打印客户端数据 recv(sockClient, recvBuf, 1024, 0); int size = atoi(recvBuf); if (size > 0) { send(sockClient, flag, strlen(flag) + 1, 0); printf("%s\n", recvBuf); FILE * file; file = fopen("1.jpg", "wb"); while (size > 0) { int recvLen = recv(sockClient, recvBuf, 1024, 0); size_t writelen = fwrite(recvBuf, sizeof(char), recvLen, file); size -= recvLen; } fclose(file); } //关闭socket closesocket(sockClient); WSACleanup(); }