본문 바로가기

C

C 소켓

728x90
반응형

소켓

프로그램이 네트워크에서 데이터를 통신할 수 있도록 하는 연결선

두 pc 혹은 프로세스 간에 통신을 가능하게 함

네트워크를 경유하는 프로세스 간 통신의 접속점으로, 소켓을 통해 클라이언트와 서버 프로그램 사이에 데이터를 송,수신할 수 있음

데이터를 통신할 수 있도록 해주는 연결부이기 때문에 통신할 두 프로그램(Client, Server) 모두에 소켓이 생성 되어야함

프로토콜

컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙 체계 = 통신 규약 및 약속

ex) http, ASCII, TCP, UDP, IP 등

 

<socket 생성함수>

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

- domain: 인터넷이나 같은 시스템 내에서 통신할지 정한다

- type: 데이터의 전송 형태

- protocol: 사용할 프로토콜 / 보통 디폴트 0을 사용

 

<sever   소켓>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>

#define BUFF_SIZE 1024

int main() {
	int server_socket;
	int client_socket;
	int client_addr_size;

	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;

	char buff_rcv[BUFF_SIZE + 5];
	char buff_snd[BUFF_SIZE + 5];

	// internet 기반의 소켓 생성 (INET)
	server_socket = socket(PF_INET, SOCK_STREAM, 0); 
	if (server_socket == -1) {
		printf("server socket fail\n");
		exit(1);
	}
	//서버의 IP주소와 PORT 번호를 sockaddr_in 구조체에 저장
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	//구조체에 저장한 주소를 socket에 연결
	if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
		printf("bind() error\n");
		exit(1);
	}
	if (listen(server_socket, 5) == -1) {
		printf("listen() fail\n");
		exit(1);
	}
	while (1) {
		client_addr_size = sizeof(client_addr);
		//클라이언트의 연결을 수락
		client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size); 
		if (client_socket == -1) {
			printf("accept() fail\n");
			exit(1);
		}
		//클라이언트로부터 전달받은 데이터를 읽음
		read(client_socket, buff_rcv, BUFF_SIZE);
		printf("receive: %s\n", buff_rcv);

		printf(buff_snd, "%d : %s", strlen(buff_rcv), buff_rcv);
		//전달받은 데이터를 다시 전송
		write(client_socket, buff_snd, strlen(buff_snd) + 1);
		//클라이언트 소켓 종료
		close(client_socket);
	}
}

<Client  소켓>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>

#define BUF_SIZE 1024

int main(int argc, char** argv) {
	int client_socket; //client socket 정보를 구하기 위해 변수 선언
	struct sockaddr_in server_addr);
	char buff[BUFF_SIZE + 5];

	client_socket = socket(PF_INET, SOCK_STREAM, 0);
	if (client_socket == -1) {
		printf("socket create fail\n");
		exit(1);
	}
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET; // IPv4 인터넷 프로토콜
	server_addr.sin_port = htons(49445); //사용할 port 번호는 49445
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //서버의 주소

	if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
		printf("connect fail\n");
		exit(1);
	}
	//클라이언트로 자료를 송신, NULL 까지 포함해서 전송
	write(client_socket, argv[1], strlen(argv[1]) + 1); 
	read(client_socket, buff, BUFF_SIZE); //클라이언트로부터 전송된 자료를 읽어들임
	printf("%s\n", buff);
	close(client_socket); //클라이언트 소켓 종료

	return 0;
}
728x90
반응형

'C' 카테고리의 다른 글

main 함수의 argc, argv  (0) 2023.02.05
C언어 총 정리  (0) 2022.11.26