Socket 傳送接收影象
阿新 • • 發佈:2018-11-25
客戶端程式碼:
#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(); }