반응형

[어플리케이션 프로토콜]

  데이터 길이 데이터
바이트 4 바이트 1 바이트
자료형  char [4] (int) char

// client

#define INT_SIZE	4	// len 바이트 수 
#define MAX_SIZE	1024
int main(int argc, char* argv[])
{
	WSADATA wsaData;
	SOCKET clnt_sock;
	SOCKADDR_IN serv_addr;
	char msg[MAX_SIZE], read_msg[MAX_SIZE];
	int recv_len, send_len;

	if (argc != 3)
	{
		printf("usage: %s <ip> <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		err_handling("startup() error");

	clnt_sock = socket(PF_INET, SOCK_STREAM, 0);
	if (clnt_sock == INVALID_SOCKET)
		err_handling("socket() error");

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
	serv_addr.sin_port = htons(atoi(argv[2]));

	if (connect(clnt_sock, &serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
		err_handling("connect() error");

	fputs("connect....\n", stdout);

	fputs("msg: ", stdout);
	scanf("%s", &msg[INT_SIZE]);
	send_len = strlen(&msg[INT_SIZE]);			// 길이 정보
	memcpy(msg, &send_len, INT_SIZE);
	send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);

	recv(clnt_sock, &recv_len, INT_SIZE, 0);	// 길이
	recv(clnt_sock, read_msg, recv_len, 0);
	read_msg[recv_len] = 0;
	printf("read msg: %s\n", read_msg);			// 수신 확인 목적

	fputs("msg: ", stdout);
	scanf("%s", &msg[INT_SIZE]);
	send_len = strlen(&msg[INT_SIZE]);			// 길이 정보
	memcpy(msg, &send_len, INT_SIZE);
	send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);

	closesocket(clnt_sock);
	WSACleanup();
	return 0;
}

// server

#define INT_SIZE	4	// len 바이트 수 
#define MAX_SIZE	1024

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	SOCKET clnt_sock, serv_sock;
	SOCKADDR_IN serv_addr, clnt_addr;
	int clnt_sz, recv_len, send_len;
	char read_msg[MAX_SIZE];
	char msg[MAX_SIZE];


	if (argc != 2)
	{
		printf("usage: %s <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		err_handling("start up() error");

	serv_sock = socket(PF_INET, SOCK_STREAM, 0);
	if (serv_sock == INVALID_SOCKET)
		err_handling("socket() error");

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if (bind(serv_sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
		err_handling("bind() error");

	if (listen(serv_sock, 5) == SOCKET_ERROR)
		err_handling("listen() error");
	clnt_sz = sizeof(clnt_addr);
	for (int n = 0; n < 5; n++)
	{
		clnt_sock = accept(serv_sock, (SOCKADDR*)&clnt_addr, &clnt_sz);
		if (clnt_sock == INVALID_SOCKET)
			err_handling("accept() error");
		else
			printf("connect: %d\n", n + 1);

		recv(clnt_sock, &recv_len, INT_SIZE, 0);		// 4바이트 길이 정보
		recv(clnt_sock, read_msg, recv_len, 0);
		read_msg[recv_len] = 0;
		printf("read msg: %s\n", read_msg);

		fputs("send msg:", stdout);
		scanf("%s", &msg[INT_SIZE]);
		send_len = strlen(&msg[INT_SIZE]);				// 길이정보
		memcpy(msg, &send_len, INT_SIZE);
		send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);

		recv(clnt_sock, &recv_len, INT_SIZE, 0);		// 4바이트 길이 정보
		recv(clnt_sock, read_msg, recv_len, 0);
		read_msg[recv_len] = 0;
		printf("read msg: %s\n", read_msg);
	}
	closesocket(serv_sock);
	WSACleanup();
	return 0;
}
반응형

+ Recent posts