데이터 송수신 원리 이론적으로 잘 몰라도 소켓으로 데이터 주고받을 수 있다.
송신 소켓과 수신 소켓은 다르다.
#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 서버에 있는 서버 프로그램과
랩탑의 클라 프로그램이 소통한 결과
석판 넣고 빼기 구현
gpt 조언
→ 1안에 화이트리스트 추가하는 식으로 결정
조종자 설계 의도 : 신과 반대로 정보 최소, 몰입 최대. 최대한 신에게서만 정보를 얻음.
그러니 ui로 정보 직접 전달은 곤란.
따라서 e나 f라는 조작법을 추가하는 것도 곤란.
마인크래프트처럼 좌클과 우클로 모든 것을 해결하고 싶음.
하지만 아이템을 얻을 때 어떻게 해야할지 곤란.
석판을 얻을 때 어떻게 '이건 얻는거'라는 생각을 불러일으킬지도 곤란.
멀티 게임 + 캐주얼 지향인데 막대한 직관성을 잃으면서까지 설계 의도나 철학을 강요할 필요는 없을듯
그냥 e나 f도 추가하고, 최대한 간단한 peak 느낌 ui 띄우는 식으로 진행