
EventHttp::accept 함수는 TCP 연결을 수락하는 함수로, 이 함수의 반환값은 실제로 소켓 디스크립터가 맞습니다. 소켓 디스크립터는 클라이언트와 서버 간의 통신을 위한 고유한 식별자로, 연결된 클라이언트의 소켓 디스크립터를 가리키는 것이 아닙니다.
TCP 연결의 3-way handshake 과정은 다음과 같습니다.
1. 클라이언트가 서버에 연결 요청을 보내고, SYN (Synchronize) 패킷을 보냅니다.
2. 서버가 클라이언트의 연결 요청을 수락하고, SYN-ACK (Synchronize-Acknowledgment) 패킷을 보냅니다.
3. 클라이언트가 서버의 SYN-ACK 패킷을 받고, ACK (Acknowledgment) 패킷을 보냅니다.
이러한 3-way handshake 과정 이후, 서버가 accept 함수를 호출하여 연결을 수락합니다. accept 함수는 클라이언트와 서버 간의 통신을 위한 소켓 디스크립터를 반환합니다.
예시 코드는 다음과 같습니다.
#hostingforum.kr
c
#include
#include
#include
#include
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
// 서버 소켓 생성
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("socket");
return 1;
}
// 서버 주소 설정
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
// 서버 소켓 바인딩
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
return 1;
}
// 서버 소켓 리스닝
if (listen(server_fd, 3) < 0) {
perror("listen");
return 1;
}
printf("서버가 시작되었습니다.n");
while (1) {
// 클라이언트 연결.accept
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
perror("accept");
continue;
}
printf("클라이언트가 연결되었습니다.n");
// 클라이언트와 통신
char buffer[1024];
recv(client_fd, buffer, 1024, 0);
printf("클라이언트가 보낸 메시지: %sn", buffer);
// 클라이언트에 메시지 보내기
char *message = "서버에서 보낸 메시지입니다.";
send(client_fd, message, strlen(message), 0);
// 클라이언트 연결 종료
close(client_fd);
}
return 0;
}
이 코드는 서버 소켓을 생성하고, 클라이언트 연결을 수락하여 클라이언트와 통신하는 예시입니다. accept 함수의 반환값은 클라이언트와 서버 간의 통신을 위한 소켓 디스크립터를 반환합니다.
2025-07-02 23:41