// SOCK_STREAM: TCP 프로토콜 사용
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET; // IPv4
serverAddr.sin_addr.s_addr = INADDR_ANY; // IP 주소
serverAddr.sin_port = htons(6667); // 포트 번호
// 서버 측
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
listen(serverSocket, 5);
accept(serverSocket, NULL, NULL);
// 클라이언트 측
connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 데이터 송신
send(clientSocket, message, strlen(message), 0);
// 데이터 수신
recv(clientSocket, buffer, sizeof(buffer), 0);
// 클라이언트 연결 상태 확인
if (eventList[i].flags & EV_EOF) {
// 연결 종료 감지
close(eventList[i].ident);
}
// IRC 메시지 전송
std::string msg = ":server 001 " + nickname + " :Welcome\r\n";
send(clientSocket, msg.c_str(), msg.length(), 0);
// 채널 메시지 브로드캐스팅
void broadcastMessage(Channel* channel, const std::string& message) {
for (auto client : channel->getClients()) {
send(client->getSocket(), message.c_str(), message.length(), 0);
}
}
따라서 TCP/IP 소켓 프로그래밍은 소켓 API를 통한 기본적인 네트워크 프로그래밍에 TCP의 연결 지향성과 신뢰성 IP의 주소 체계와 라우팅을 더한 것
// 기본적인 소켓 통신 흐름
int sock = socket(); // 소켓 생성
bind(); // 주소 할당
listen(); // 연결 대기
accept(); // 연결 수락
send()/recv(); // 데이터 송수신
close(); // 연결 종료
// TCP/IP 관련 구조체
struct sockaddr_in {
sa_family_t sin_family; // 주소 체계 (AF_INET)
in_port_t sin_port; // 포트 번호
struct in_addr sin_addr; // IP 주소
};
// TCP/IP 소켓 통신 예시
int serverSocket = socket(AF_INET, SOCK_STREAM, 0); // TCP 소켓 생성
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET; // IPv4
serverAddr.sin_addr.s_addr = INADDR_ANY; // IP 주소
serverAddr.sin_port = htons(PORT); // 포트 번호
bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));
// 1. 소켓 통신 부분
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
bind(serverSocket, ...);
listen(serverSocket, 5);
// 2. TCP/IP 부분
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(6667);
// 3. TCP/IP 소켓 통신
// 연결 수락 및 데이터 송수신
int clientSocket = accept(serverSocket, NULL, NULL);
char buffer[1024];
recv(clientSocket, buffer, sizeof(buffer), 0); // 신뢰성 있는 데이터 수신
send(clientSocket, response, strlen(response), 0); // 신뢰성 있는 데이터 송신