250829

lililllilillll·2025년 8월 29일

개발 일지

목록 보기
278/350

✅ 한 것들


  • 윤성우의 열혈 TCP/IP 소켓 프로그래밍
  • Project GNC


📖 윤성우의 열혈 TCP/IP 소켓 프로그래밍


Part 01 네트워크 프로그래밍의 시작

Chapter 01 네트워크 프로그래밍과 소켓의 이해

01-1 네트워크 프로그래밍과 소켓의 이해

데이터 송수신 원리 이론적으로 잘 몰라도 소켓으로 데이터 주고받을 수 있다.
송신 소켓과 수신 소켓은 다르다.

#include <sys/socket.h>
int socket(int domain, int type, int protocol); // 소켓 생성 함수. 성공 시 파일 디스크립터, 실패 시 -1 반환.
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); // 소켓에 주소 정보 할당. 성공 시 0, 실패 시 -1 반환
int listen(int sockfd, int backlog); // 연결 요청 가능 상태로 변경. 성공 시 0, 실패 시 -1 반환
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 연결 요청 수락. 성공 시 파일 디스크립터, 실패 시 -1 반환

소켓 관련 기본 함수

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int serv_sock;
	int clnt_sock;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[] = "Hello World!";

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

	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	if(serv_sock == -1)
		error_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, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
		error_handling("bind() error");

	if(listen(serv_sock, 5) == -1)
		error_handling("listen() error");

	clnt_addr_size=sizeof(clnt_addr);
	clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
	if(clnt_sock==-1)
		error_handling("accept() error");
	
	write(clnt_sock, message, sizeof(message));
	close(clnt_sock);
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

연결 요청 기다리는 서버 프로그램

  • AF_INET : IPv4 인터넷 프로토콜
  • SOCK_STREAM : TCP 소켓
  • INADDR_ANY : 0.0.0.0 의미. 모든 IP 주소 연결 수락.
  • htonl() : host to network long. 네트워크 바이트 오더(빅 엔디안)로 변환하여 프로토콜 표준 맞춤.
  • htnos() : host to network short. 포트 번호도 네트워크 바이트 오더로 맞춤.
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len;

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

	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("connect() 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(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
		error_handling("connect() error");

	str_len=read(sock,message,sizeof(message)-1);
	if(str_len==-1)
		error_handling("read() error!");

	printf("Message from server :%s \n", message);
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

연결 요청 보내는 클라 프로그램

AWS 서버에 있는 서버 프로그램과
랩탑의 클라 프로그램이 소통한 결과



🎮 Project GNC


석판 넣고 빼기 구현

  • (1안) ConInteract에서 Structure의 MainInteract를 호출한 후, player에게 석판이 있다면 그걸 가져온다.
    • 문제 : 석판인지 아닌지 구분할 정보가 존재하지 않음
    • 아이템이 들어가는 건데 석판이 책임져야 하는가?
  • (2안) ConItemUse에서 E를 누르면 OnPressE을 호출하여 최종적으로 actionSO에 있는 OnPressE를 호출
    • 문제 : 인터페이스에 OnPressE를 추가하면 필요없는 다른 모든 아이템에도 OnPressE가 추가됨
    • 석판에 들어가는 건데 아이템이 책임져야 하는가?

gpt 조언

  • 두 안 모두 비틀렸다.
  • “구조물(틀)”이 무엇을 받아줄지를 결정하고,
  • 플레이어의 손/인벤토리에서 현재 선택된 아이템을 받아
  • “슬롯”에 삽입/배출하는 흐름이 맞다.

→ 1안에 화이트리스트 추가하는 식으로 결정

조종자 설계 의도 : 신과 반대로 정보 최소, 몰입 최대. 최대한 신에게서만 정보를 얻음.
그러니 ui로 정보 직접 전달은 곤란.
따라서 e나 f라는 조작법을 추가하는 것도 곤란.
마인크래프트처럼 좌클과 우클로 모든 것을 해결하고 싶음.
하지만 아이템을 얻을 때 어떻게 해야할지 곤란.
석판을 얻을 때 어떻게 '이건 얻는거'라는 생각을 불러일으킬지도 곤란.
멀티 게임 + 캐주얼 지향인데 막대한 직관성을 잃으면서까지 설계 의도나 철학을 강요할 필요는 없을듯
그냥 e나 f도 추가하고, 최대한 간단한 peak 느낌 ui 띄우는 식으로 진행



profile
너 정말 **핵심**을 찔렀어

0개의 댓글