처음부터 차근차근

tcp 소켓 생성과 TCP 클라이언트용 API 본문

Linux & Unix

tcp 소켓 생성과 TCP 클라이언트용 API

_soyoung 2022. 5. 22. 11:08
반응형

Tcp 소켓 생성

#include <stdio.h> // c 언어 파일 작성할 때 필요한 헤더
#include <unistd.h> // unix 계열 헤더
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>

#define MAX_FD 4

int main(void) {

	int fd[MAX_FD] = { -1, }; // 소켓 기술자 선언
	int i = 0;

	// 프로세스 id 출력
	printf("Process ID : %d\n", getpid());

	// 소켓 생성하여 fd 배열 안에다 대입
	// PF_INET : IPv4 인터넷 프로토콜, SOCK_STREAM : TCP
	for (i = 0; i < MAX_FD; i++) {
		fd[i] = socket(PF_INET, SOCK_STREAM, 0);
	}

	// enter 키 받아서 socket fd close
	printf("Process Enter key to close all sockets.\n");
	getchar();
	for (i = 0; i < MAX_FD; i++) {
		close(fd[i]);
	}

	printf("Press Enter key finish.\n");
	getchar();

	return 0; // 종료
}

 

 

실행결과

/proc/프로세스id/fd 에서 ls -l을 이용해서 보면 소켓이 4개가 할당됨을 볼 수 있다.

 

 

Enter을 하면 소켓들이 없어진 것을 볼 수 있다.

 

 

프로세스가 끝났다.

 

 

 

Tcp용 클라이언트

#include <stdio.h> // c 언어 파일 작성할 때 필요한 헤더
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

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

	// 변수 생성
	int fd = -1;
	struct sockaddr_in sock_client; // IPv4 주소체계에서 사용하는 구조체

	// 파라미터의 개수가 3개가 아니면(자신 포함해서) 
	if (argc != 3) {
		printf("Usage : %s <ip> <port>\n", argv[0]);
		return -1; // 종료
	}

	// sock_client에다 0을 세팅
	memset(&sock_client, 0, sizeof(sock_client));

	sock_client.sin_family = AF_INET; // 주소체계 : IPv4
	sock_client.sin_addr.s_addr = (in_addr_t)inet_addr(argv[1]); // 파라미터로 받은 ip 할당
	sock_client.sin_port = htons(atoi(argv[2])); // 네트워크 바이트 정렬 방식의 4바이트 데이터를 호스트 바이트 정렬 방식으로 변환

	fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 소켓 생성

	// 서버에 접속을 요청
	if (connect(fd, (struct sockaddr*)&sock_client, sizeof(sock_client)) == 0) { // 성공시 0, 실패 -1
		printf("Connetion Success.\n");
	}
	else {
		printf("Connetion faliure.\n");
	}

	// enter 키를 받아 프로그램 종료
	printf("Press Enter key to finish.\n");
	getchar();
	close(fd);
	return 0; // 종료
}

 

실행결과(실행과정)

Tcp 연결을 위한 서버를 30000 포트로 연다.

 

 

Netstat 쳐보면 서버가 돌고 있는 것을 확인할 수 있다.

 

 

Ip address 명령어를 사용해서 포트 주소 확인한다.

 

 

아까 확인한 포트주소를 파라미터로 사용한다.

서버 connection 성공

 

 

netstat를 쳐보면 서버와 클라이언트가 열려있는 것을 볼 수 있다.

 

 

<telnet으로 확인>

서버를 연다음 telnet으로 확인

아무거나 쳐봤을 때

 

 

서버 측에서도 똑같은 내용이 보이는 것을 볼 수 있다.

 

 

 

출처 : 네트워크개론(22-1학기)김병국교수 강의 내용 변형 및 요약

반응형
Comments