"시스템 프로그래밍" 과목에서 Socket을 가지고 Client-Server Archtecture를 구성하여
서로 데이터를 주고 받는 프로젝트를 진행중이다.
작성언어는 C언어이고 여러가지 System Call을 사용한다.
( 윈도우 내에서 시스템 호출을 사용해서 다른 시스템간 핑을 주고 받기 위해
Cygwin64 Terminal_gcc core version 10.2.0사용중 )
<사용하는 System Call 목록 및 설명>
#include <sys/socket.h>
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
Client | Server |
sock = socket(AF_INET, SOCK_STREAM, 0) |
server_fd = socket(AF_INET, SOCK_STREAM, 0) |
serv_addr.sin_port = htons(PORT); |
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) |
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) |
inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr) |
connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) |
serverAddress.sin_port = htons( PORT ); |
inet_ntop(AF_INET, &(serv_addr.sin_addr), serverAddressStr, sizeof(serv_addr)); |
bind(server_fd, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) |
listen(server_fd, 3) |
|
accept(server_fd, &connection->address, &connection->addr_len); |
이때 Local 에서는 inet_pton 시스템 호출의 주소입력 부분에 Server 와 Client 모두 127.0.0.1을 입력하면 잘 돌아갑니다.
(확인방법 : gcc -o client.out Socket_Client.c / gcc -o server.out Socket_Server.c 하여 두개의 터미널 창에서 각각 실행)
하지만 문제는 서로다른 시스템(PC)+서로다른 네트워크 일때 문제가 발생합니다.
이때는 inet_pton의 주소입력 부분을 Server와 Client는 각각 다르게 설정해주어야하는데요.
결론 부터 알려드리자면 (포트번호는 각각 동일하다는 가정하)
Server : inet_pton(AF_INET, "<서버의 내부 ip 주소>", &serv_addr.sin_addr)
Client : inet_pton(AF_INET, "<서버의 외부 ip 주소>", &serv_addr.sin_addr) 로 설정해주시면 됩니다.
✔서버의 내부 ip 주소 찾기 :
서버의 PC에서 cmd(명령프롬프트 or terminal)에서 "ipconfig" 명령어 입력하면
IPv4주소: 192.168.x.x
기본 게이트웨이 : 192.168.0.1
가 나올 것이다