상세 컨텐츠

본문 제목

소켓통신(Socket Communication) + 포트 포워딩(Port Forwarding)

카테고리 없음

by <감귤> 2020. 12. 7. 14:43

본문

"시스템 프로그래밍" 과목에서 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_INETSOCK_STREAM0)
-> IPv4, Stream Socket(TCP)을 사용하여 socket생성

server_fd = socket(AF_INETSOCK_STREAM0)
-> 클라이언트와 동일하게 맞춰줘야됨

serv_addr.sin_port = htons(PORT); 
->

setsockopt(server_fdSOL_SOCKETSO_REUSEADDR, &optsizeof(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_addrsizeof(serv_addr))
->

serverAddress.sin_port = htonsPORT ); 
->

 inet_ntop(AF_INET, &(serv_addr.sin_addr), serverAddressStrsizeof(serv_addr));
->

bind(server_fd, (struct sockaddr *)&serverAddresssizeof(serverAddress))
->

 

listen(server_fd3)

 

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 

가 나올 것이다