소켓프로그래밍

메시지 주고받기

blackbearwow 2020. 9. 19. 15:58

서버

#include <iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

union GameMoney {
	int money;
	char buf[4];
};

bool g_Loop = true;

void Error(char* m);
void readMoneyData(GameMoney* m);
void saveMoneyData(GameMoney* m);
int main()
{
	int gMoney = 0;
	GameMoney m;
	m.money = 0;
	readMoneyData(&m);
	printf("%d \n", m.money);
	m.money = 2147483647;
	saveMoneyData(&m);
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) Error("WSAStartup() error");

	SOCKET hServSock, hClntSock;
	SOCKADDR_IN servAddr, clntAddr;

	int szClntAddr;
	char message[30];
	memset(&message, 0, sizeof(message));
	strcpy(message, "money: ");
	strcat(message, m.buf);
	strcat(message, "\n");

	hServSock = socket(PF_INET, SOCK_STREAM, 0);
	if (hServSock == INVALID_SOCKET) Error("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(atoi("9876"));

	if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) Error("bind() error");
	
	if (listen(hServSock, 5) == SOCKET_ERROR) Error("listen() error");

	szClntAddr = sizeof(clntAddr);
	hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
	if (hClntSock == INVALID_SOCKET) Error("accept() error");

	send(hClntSock, message, sizeof(message), 0);

	while (g_Loop)
	{
		memset(&message, 0, sizeof(message));
		strcpy(message, "1. pc방 알바 2. 편의점 알바\n");
		send(hClntSock, message, sizeof(message), 0);

		memset(&message, 0, sizeof(message));
		int strLen = recv(hClntSock, message, sizeof(message) - 1, 0);
		if (strLen == -1)Error("recv() error");
	}
	closesocket(hClntSock);
	closesocket(hServSock);

	WSACleanup();
	return 0;
}

void saveMoneyData(GameMoney* m)
{
	FILE* fp;
	fp = fopen("money.txt", "w");
	if (fp == NULL)
	{
		Error("file save error");
	}
	fwrite(m->buf, 1, 4, fp);
	//printf("%d %d %d %d \n", m->buf[0], m->buf[1], m->buf[2], m->buf[3]);
	fclose(fp);
}

void readMoneyData(GameMoney* m)
{
	char buf[4];
	FILE* fp;
	fp = fopen("money.txt", "r");
	int size;
	if (fp == NULL)
	{
		system("type nul > money.txt");
		Error("file read failed");
	}
	else
	{
		fseek(fp, 0, SEEK_END);
		size = ftell(fp);
		if (size == 0) 
		{
			m->money = 0;
			printf("no size \n");
		}
		else
		{
			fseek(fp, 0, SEEK_SET);
			fread(m->buf, sizeof(char), 4, fp);
			//printf("%d %d %d %d \n", m->buf[0], m->buf[1], m->buf[2], m->buf[3]);
		}
	}
	fclose(fp);
}

void Error(char* m)
{
	printf("%s \n", m);
	exit(1);
}

클라

#include <iostream>
#include <string>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

union GameMoney {
	int money;
	char buf[4];
};

bool g_Loop = true;

void Error(char* m)
{
	printf("%s \n", m);
	exit(1);
}
int main()
{
	GameMoney m;
	m.money = 0;
	string str1("money");
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) Error("WSAStartup() error");

	SOCKET hSocket;
	SOCKADDR_IN servAddr;

	char message[30];
	int strLen;

	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET) Error("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servAddr.sin_port = htons(atoi("9876"));

	if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) Error("connect() error");

	strLen = recv(hSocket, message, sizeof(message) - 1, 0);
	if (strLen == -1) Error("recv() error");
	string str2(message);
	string str3;
	size_t found = str2.find(str1);
	if (found != string::npos)
	{
		str3 = str2.substr(7, 4);
		str3.copy(m.buf, 4);
	}
	else
		cout << "can't find" << endl;

	printf("%s \n", message);
	printf("%d \n", m.money);

	while (g_Loop)
	{
		memset(&message, 0, sizeof(message));
		strLen = recv(hSocket, message, sizeof(message), 0);
		if (strLen == -1) Error("recv() error");
		cout << "server: " << message << endl;

		memset(&message, 0, sizeof(message));
		scanf("%s\n", message);
		send(hSocket, message, sizeof(message), 0);
	}

	closesocket(hSocket);

	WSACleanup();
	return 0;
}