프로그래밍의 기초/TCP | IP

C언어를 통한 네트워크 프로그래밍의 이해

Kim나현 2022. 1. 5. 17:24
반응형
  • 소켓: 네트워크망에 연결하기 위한 도구

  • 서버: 연결 요청을 수락하는 기능의 프로그램

- socket의 생성

- ip, port number를 서버 socket에 할당

- 소켓을 연결 요청 가능한 상태로 만듦

- socket을 통해 연결 요청 수락

  • 클라이언트: 연결 요청을 진행하는 소켓

- socket의 생성

- 연결 요청

더보기

[리눅스 기반으로 실행]

GCC컴파일러: 리눅스 C컴파일러

 

  • 컴파일

gcc hello_server.c -o hserver

→hello_server.c 파일을 컴파일하여 hserver라는 이름의 실행파일을 만듦

  • 실행

./hserver

→현재 디렉터리에 있는 hserver라는 이름의 파일을 실행


윈도우 기반으로 코드를 사용할 경우

[server socket programming]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <sys/types.h>
#include <sys/stat.h>

void err_handling(const char* message)
{
	fputs(message, stderr);
	fputs("\n", stderr);
	printf("erroor: %d", WSAGetLastError());
	exit(1);
}
int main(int argc, char*argv[])
{
	WSADATA wsaData;
	SOCKET serv_sock;
	SOCKET clnt_sock;

	SOCKADDR_IN serv_addr;
	SOCKADDR_IN clnt_addr;
	socklen_t clnt_addr_size;

	char message[] = "Hello, world";
	
	if (argc != 2)		// 입력 인수 2개 아닐경우
	{
		printf("Usage: %s <port>, argc: %d\n", argv[0], argc);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //소켓 라이브러리 초기화
		err_handling("WSAStartup() error!");

	serv_sock = socket(PF_INET, SOCK_STREAM, 0);		// create socket
	if (serv_sock == -1)
		err_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);		// ip
	serv_addr.sin_port = htons(atoi(argv[1]));			// port

	if (bind(serv_sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == -1)		// 서버socket에 ip, port 할당
		err_handling("bind() error");

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

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock, (SOCKADDR*)&clnt_addr, &clnt_addr_size);		// accept to client when connection from client
	if (clnt_sock == -1)
		err_handling("accept() error");

	send(clnt_sock, message, sizeof(message), 0);
	closesocket(clnt_sock);
	closesocket(serv_sock);
	WSACleanup();

	return 0;
}

[client socket programming]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <sys/types.h>
#include <sys/stat.h>

void err_handling(const char* message)
{
	fputs(message, stderr);
	fputs("\n", stderr);
	printf("erroor: %d", WSAGetLastError());
	exit(1);
}
int main(int argc, char* argv[])
{
	WSADATA wsaData;
	SOCKET sock;
	SOCKADDR_IN serv_addr;
	char messsage[30];
	int str_len;

	if (argc != 3)  //입력인수 3개 아닐경우
	{
		printf("Usage: %s <IP> <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //소켓 라이브러리 초기화
		err_handling("WSAStartup() error!");

	sock = socket(PF_INET, SOCK_STREAM, 0);			// create client socket
	if (sock == -1)
		err_handling("socket() error");

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);		// ip
	serv_addr.sin_port = htons(atoi(argv[2]));			// port

	if (connect(sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == -1)	//connect
		err_handling("connect() error");

	str_len = recv(sock, messsage, sizeof(messsage) - 1, 0);
	if (str_len == -1)
		err_handling("read() error");

	printf("message from server: %s\n", messsage);
	closesocket(sock);
	WSACleanup();

	return 0;
}
반응형