본문 바로가기
개발 이야기/리눅스 이야기

리눅스 C 기본 소켓통신

by 런던살자 2019. 7. 2.

안녕하세요 마블랑입니다.

 

리눅스에서 C를 이용한 소켓프로세스를 구현할때 사용가능한 예제코드를 구현해보았습니다.

 

C#에서도 동일한 소켓통신 관련된 내용을 포스팅한적이 있는데요

 

그것을 리눅스에서 C로 구현했다고 보시면 됩니다.

 

 

예제 샘플의 화면을 보겠습니다.

 

왼쪽 위에 화면이 서버이고 오른쪽 아래 화면이 클라이언트입니다.

 

C#과 동일하게 클라이언트에서 메시지를 입력하면 서버로 전송되고 서버는 메시지를 표시하는 동시에 다시 클라이언트에게 보내주는 echo 서버입니다. 

 

종료역시 동일하게 클라이언트에서 'exit'를 입력해주시면 됩니다.

 

그럼 코드를 살펴보겠습니다.

 

각각 주석을 달아놓았습니다. 

 

기존 소켓통신 흐름을 알고있다면 어렵지 않게 이해할수 있을듯 합니다. 

 

1. Server

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

#define PORT 8889
#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
	int sockServer, sockClient;
	char strMsg[BUF_SIZE];
	int str_len;

	struct sockaddr_in addrServer;
	struct sockaddr_in addrClient;
	socklen_t addrClient_sz;

	//소켓생성
	sockServer = socket(PF_INET, SOCK_STREAM, 0);
	if (sockServer == -1)
		printf("socket create() error\n");
	else
		printf("Socket create() Success!\n");

	//소켓 IP 및 포트 정보 설정 및 bind
	memset(&addrServer, 0, sizeof(addrServer));
	addrServer.sin_family = AF_INET;
	addrServer.sin_addr.s_addr = htonl(INADDR_ANY);
	addrServer.sin_port = htons(PORT);

	if (bind(sockServer, (struct sockaddr*) & addrServer, sizeof(addrServer)) == -1)
		printf("bind() error\n");
	else
		printf("bind() Success\n");

	//클라이언트 연결 대기 상태
	if (listen(sockServer, 5) == -1)
		printf("iisten() error\n");
	else
		printf("Waiting.....\n");

	//클라이언트 연결 수락
	addrClient_sz = sizeof(addrClient);
	sockClient = accept(sockServer, (struct sockaddr*) & addrClient, &addrClient_sz);
	if (sockClient == -1)
		printf("accept() error\n");
	else
		printf("Connected client! \n");

	//데이터 송수신
	while (1) {
		memset(strMsg, 0x00, BUF_SIZE);
		if ((str_len = read(sockClient, strMsg, BUF_SIZE)) == 0) {
			break;
		}

		if (!strcmp(strMsg, "exit"))
			break;
		printf("%s\n", strMsg);
		write(sockClient, strMsg, str_len);
	}

	//소켓 종료
	close(sockClient);
	close(sockServer);
	return 0;
}

 

 

2. Client

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

#define IP "127.0.0.1"
#define PORT 8889
#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
	int sock;
	char strMsg[BUF_SIZE];
	int str_len;
	struct sockaddr_in addrServer;

	//소켓생성
	sock = socket(PF_INET, SOCK_STREAM, 0);
	if (sock == -1)
		printf("socket create() error\n");

	//소켓 IP 및 포트 정보 설정 
	memset(&addrServer, 0, sizeof(addrServer));
	addrServer.sin_family = AF_INET;
	addrServer.sin_addr.s_addr = inet_addr(IP);
	addrServer.sin_port = htons(PORT);

	//서버 연결
	if (connect(sock, (struct sockaddr*) & addrServer, sizeof(addrServer)) == -1)
		printf("connect() error\n");
	else
		printf("Connected!\n");


	//데이터 송수신 
	while (1)
	{
		memset(strMsg, 0x00, BUF_SIZE);
		scanf("%s", strMsg);

		if (!strcmp(strMsg, "exit"))
			break;

		write(sock, strMsg, strlen(strMsg));
		str_len = read(sock, strMsg, BUF_SIZE - 1);
		strMsg[str_len] = 0;
		printf("%s\n", strMsg);

	}

	//소켓 종료
	close(sock);
	return 0;
}

 

 

컴파일하는 단계에서 별다른 옵션 없이 컴파일을 진행하면 되겠습니다.

 

 

이상 마블랑이었습니다. 

 

읽어주셔서 고맙습니다.

 

 

 

 

 

 

 

댓글