C/Code snippet
[C][소켓] 소켓 통신 예제 (Socket)
2024. 9. 4. 23:28반응형
C언어 소켓 통신의 기본예제를 살펴본다. WSL 환경에서 작업했다. TCP 통신의 기본 예제로 생각하면 된다.
■ 클라이언트 측 코드 (client.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE] = {0};
char *hello = "Hello from client";
// 소켓 생성
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// IP 주소 변환
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
// 서버에 연결
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
// 서버로 메시지 전송
send(sock, hello, strlen(hello), 0);
printf("Hello message sent\n");
// 서버로부터 메시지 수신
int valread = read(sock, buffer, BUFFER_SIZE);
printf("Received from server: %s\n", buffer);
// 소켓 종료
close(sock);
return 0;
}
■ 서버 측 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
char *hello = "Hello from server";
// 소켓 생성
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 주소 구조체 초기화
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 소켓에 주소를 바인딩
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 연결 대기 (백로그 큐 크기: 3)
if (listen(server_fd, 3) < 0) {
perror("listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is waiting for connections...\n");
// 클라이언트 연결 수락
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {
perror("accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 클라이언트로부터 메시지 수신
int valread = read(new_socket, buffer, BUFFER_SIZE);
printf("Received from client: %s\n", buffer);
// 클라이언트로 메시지 전송
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
// 소켓 종료
close(new_socket);
close(server_fd);
return 0;
}
실행 순서
STEP 1. 터미널 창 하나 열어서 서버 먼저 실행
gcc -o server server.c
./server
STEP 2. 이후 터미널 창 하나 더 열어서 클라이언트 실행
gcc -o client client.c
./client
설명
- 서버는 8080 포트에서 클라이언트의 연결을 대기합니다.
- 클라이언트는 서버에 연결하여 "Hello from client" 메시지를 전송합니다.
- 서버는 메시지를 수신하고, 클라이언트에게 "Hello from server" 메시지를 응답합니다.
반응형
'C > Code snippet' 카테고리의 다른 글
[C] execvp 사용법 (인자를 args로 전달하기) (0) | 2023.04.03 |
---|---|
[C] strlen의 인자로 char* 자료형을 넣었을 때 결과 확인 코드 (0) | 2023.01.27 |
[C] 예제코드: 파일읽기, 삭제 (0) | 2023.01.15 |
[C] 문자열 파싱 (strtok없이), strcpy, strdup, strlen (0) | 2022.07.10 |
[C] exec - execl 예제, c언어 내부에서 ls 같은 시스템 명령어 실행하기 (0) | 2022.06.03 |