C에서 포크를 사용하는 다중 처리 소켓 서버를 사용하면 여러 클라이언트 연결을 동시에 처리할 수 있습니다. 포크 시스템 호출을 활용하여 서버는 연결된 각 클라이언트에 대한 하위 프로세스를 생성하여 독립적인 통신 채널을 보장할 수 있습니다. 이 접근 방식을 사용하면 여러 클라이언트와 동시에 통신할 수 있습니다.
C에서 포크를 사용하여 다중 처리 소켓 서버를 구현하는 방법에 대해 논의하겠습니다. C에서 포크를 사용하여 다중 처리 소켓 서버를 구현할 수 있는 서버 측 프로그램과 클라이언트 측 프로그램의 프로그래밍 예에 대해 설명합니다.
포크 시스템 호출이란 무엇인가요?
시스템 호출이 기존 프로세스의 복제를 만드는 것을 "fork()" 시스템 호출이라고 합니다. 기본적으로 실행 중인 프로그램을 상위 프로세스와 하위 프로세스로 알려진 두 개의 별도 프로세스로 나눕니다. PID가 다르다는 점을 제외하면 하위 프로세스와 상위 프로세스의 모든 매개변수는 동일합니다. 이 시스템 호출은 다음을 반환합니다:
- 상위 프로세스에 대한 하위 프로세스의 PID
- 자녀에게는 영(0)
프로그래밍 예 1:서버측 프로그램
#include
#include
#include
#include
#include <문자열.h>
#include
#include
#include
#포트 8888 정의
정수 메인()
{
int serSoc, cliSoc;
struct sockaddr_in serverAddr, clientAddr;
socklen_t addrSize =sizeof(clientAddr);
문자 버퍼 [1024];
int clientCount =0;
// 서버 소켓 생성
serSoc =소켓(AF_INET, SOCK_STREAM, 0);
if (serSoc <0) {
perror("소켓 생성 오류");
출구 (1);
}
printf("서버 소켓이 생성되었습니다.\n");
// 서버 주소를 설정해 보겠습니다.
serverAddr.sin_family =AF_INET;
serverAddr.sin_port =htons(포트);
serverAddr.sin_addr.s_addr =INADDR_ANY;
if (bind(serSoc, (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
perror("바인딩 오류");
출구 (1);
}
// 들어오는 연결 수신을 시작합니다.
if (듣기 (serSoc, 5) ==0) {
printf("연결을 수신하는 중...\n");
} 그렇지 않으면 {
perror("듣는 중 오류가 발생했습니다");
출구 (1);
}
동안 (1) {
// 클라이언트 연결을 수락하겠습니다.
cliSoc =승인 (serSoc, (struct sockaddr* )&clientAddr, &addrSize);
if (cliSoc <0) {
perror("연결 수락 중 오류가 발생했습니다.");
출구 (1);
}
// 클라이언트 수를 증가시키고 클라이언트 정보를 표시합니다
클라이언트카운트++;
printf("클라이언트 %d에서 연결이 승인되었습니다:%s:%d\n", clientCount, inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port));
printf("연결된 총 클라이언트 수:%d\n", clientCount);
pid_t pid =포크();
if (pid ==0) {
// 하위 프로세스
닫기(serSoc);
//클라이언트로부터 메시지 수신
동안 (1) {
memset(버퍼, 0, sizeof(버퍼));
if (recv (cliSoc , 버퍼, sizeof (버퍼), 0) <0) {
perror("데이터 수신 오류");
출구(1);
}
printf("%d 클라이언트로부터 데이터를 받았습니다:%s\n", clientCount, buffer);
// 수신된 메시지를 클라이언트에게 다시 에코합니다.
if (send (cliSoc , buffer, strlen (버퍼), 0) 0) {
// 상위 프로세스
닫기(cliSoc );
} 그렇지 않으면 {
perror("포킹 중 오류 발생");
출구 (1);
}
}
// 서버 소켓을 닫는다
닫기(serSoc);
0을 반환합니다.
}
프로프로그래밍 예 2:클라이언트측 프로그램
#include
#include
#include
#include
#include <문자열.h>
#include
#include
#include
#포트 8888 정의
#define SERVER_IP "127.0.0.1"
정수 메인()
{
int cliSoc;
struct sockaddr_in serverAddr;
문자 버퍼 [1024];
// 클라이언트 소켓 생성
cliSoc =소켓(AF_INET, SOCK_STREAM, 0);
if (cliSoc <0) {
perror("소켓 생성 오류");
출구 (1);
}
printf("클라이언트 %d 소켓이 생성되었습니다.\n", getpid ());
// 서버 주소 매개변수 설정
serverAddr.sin_family =AF_INET;
serverAddr.sin_port =htons(포트);
serverAddr.sin_addr.s_addr =inet_addr (SERVER_IP);
// 서버에 연결
if (connect (cliSoc , (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
perror("서버 연결 중 오류가 발생했습니다.");
출구 (1);
}
printf("서버에 연결되었습니다.\n");
동안 (1) {
// 사용자로부터 입력을 읽습니다.
printf("클라이언트 %d - 메시지를 입력하세요:", getpid ());
fgets(버퍼, sizeof(버퍼), 표준 입력);
if (send (cliSoc , 버퍼, strlen (버퍼), 0) <0) {
perror("데이터 전송 중 오류 발생");
출구 (1);
}
// 서버로부터 응답을 받습니다.
memset(버퍼, 0, sizeof(버퍼));
if (recv (cliSoc , 버퍼, sizeof (버퍼), 0) <0) {
perror("데이터 수신 오류");
출구 (1);
}
printf("클라이언트 %d - 서버 응답:%s\n", getpid(), buffer);
}
// 클라이언트 소켓을 닫는다
닫기(cliSoc );
0을 반환합니다.
}
출력:
**서버 프로그램 컴파일**
$ gcc ser.c -o ser
$ ./ser
서버 소켓이 생성되었습니다.
연결을 듣는 중...
서버 소켓이 생성되었습니다.
연결을 듣는 중...
클라이언트 1에서 허용된 연결:127.0.0.1:59074
연결된 총 클라이언트:1
클라이언트 1로부터 데이터 수신됨:hii admin
클라이언트 2에서 허용된 연결:127.0.0.1:40192
연결된 총 클라이언트:2
클라이언트 2로부터 데이터 수신됨:안녕하세요 여러분
**클라이언트 1 프로그램 편집**
$ gcc cel.c -o cel
$ ./셀
클라이언트 4007 소켓이 생성되었습니다.
서버에 연결되었습니다.
클라이언트 4007 - 메시지 입력:hii admin
**클라이언트 2 프로그램 편집**
$ gcc cel.c -o cel
$ ./셀
클라이언트 4024 소켓이 생성되었습니다.
서버에 연결되었습니다.
클라이언트 4024 - 메시지 입력:안녕하세요 여러분
설명:
이 프로그래밍 예제에서는 C에서 포크를 사용하여 다중 처리 소켓 서버의 구현을 설명했습니다. 여기 서버 측 프로그램에서는 서버 소켓을 생성하고 이를 특정 주소 및 포트에 바인딩하고 들어오는 연결을 수신합니다. 클라이언트가 연결되면 "fork()"를 사용하여 하위 프로세스가 생성됩니다. 이를 통해 여러 클라이언트를 동시에 처리할 수 있습니다. 하위 프로세스는 클라이언트로부터 메시지를 수신하고 클라이언트의 ID와 함께 데이터를 표시합니다. 이 다중 처리 소켓 서버를 사용하면 "n"개의 클라이언트와 동시에 통신할 수 있습니다.
결론
우리는 C에서 포크를 사용하는 다중 처리 소켓 서버의 구현에 대해 논의했습니다. 포크 시스템 호출을 사용하면 여러 클라이언트 연결을 동시에 처리할 수 있습니다. 이를 통해 여러 클라이언트와 동시에 통신하고 클라이언트 요청을 효율적으로 처리할 수 있습니다.
작가 소개
밤데브 고쉬
Bamdeb Ghosh는 무선 네트워킹 분야에서 실무 경험을 갖고 있습니다. 그는 Android, Bluetooth, Linux 명령 및 Python에 대한 지식과 함께 무선 또는 유선 네트워킹에 대한 Wireshark 캡처 분석 전문가입니다. 그의 사이트를 팔로우하세요:wifisharks.com