天天看點

Socket 發送接收圖像

用戶端代碼:

#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();
}