리눅스 멀티스레드 파일 공유 프로그램 - 3 본문
클라이언트의 코드를 분석해 본다.
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE] = {0};
// 소켓 파일 디스크립터 생성
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket creation error" << std::endl;
return -1;
}
// 서버 주소 구조체 설정
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 주소 변환
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
std::cerr << "Invalid address/ Address not supported" << std::endl;
return -1;
}
// 서버에 연결
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "Connection Failed" << std::endl;
return -1;
}
// 서버에 메시지 보내기
const char *message = "Hello from client";
send(sock, message, strlen(message), 0);
std::cout << "Hello message sent" << std::endl;
// 서버로부터 메시지 읽기
int valread = read(sock, buffer, BUFFER_SIZE);
std::cout << "Message received: " << buffer << std::endl;
// 소켓 종료
close(sock);
return 0;
}
전체 코드이다.
// 소켓 파일 디스크립터 생성
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket creation error" << std::endl;
return -1;
}
// 서버 주소 구조체 설정
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
이 부분은 전 서버와 같이
socket()을 이용해 소켓 디스크립터를 생성해 준다.
구조체에 데이터를 넣어준다.
// 주소 변환
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
std::cerr << "Invalid address/ Address not supported" << std::endl;
return -1;
}
구조체 serv_addr.sin_addr에 IP값을 넣어야 한다.
inet_pton은 사람이 읽는 문자를 바이너리 형식으로 변환해 주는 함수이다.
네트워크 통신을 위해서는 바이너리 형식으로 바꿔주어야 한다.
"127.0.0.1"의 주소를 AF_INET형식으로 serv_addr.sin_addr에 넣어준다.
char ip_str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(serv_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
std::cout << "IP address: " << ip_str << std::endl;
추가로 serv_addr.sin_addr에 데이터가 잘 들어갔나 확인해보고 싶어
변환해 주는 코드를 짰다.
다시 변환할 때는 inet_ntop() 함수를 이용한다.
또한 INET_ADDRSTRLEN은 16이라는 상수이다.
// 서버에 연결
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "Connection Failed" << std::endl;
return -1;
}
서버에 connect 해준다.
서버의 IP는 0.0.0.0이며
해당 클라이언트는 127.0.0.1이며 로컬통신이 가능해진다.
만들어둔 serv_addr을 타입캐스트 해준다.
// 서버에 메시지 보내기
const char *message = "Hello from client";
send(sock, message, strlen(message), 0);
std::cout << "Hello message sent" << std::endl;
// 서버로부터 메시지 읽기
int valread = read(sock, buffer, BUFFER_SIZE);
std::cout << "Message received: " << buffer << std::endl;
// 소켓 종료
close(sock);
서버와 클라이언트의 메시지를 주고받는다.
'개발 > 개인공부' 카테고리의 다른 글
리눅스 멀티스레드 파일 공유 프로그램 - 6 (0) | 2024.06.10 |
---|---|
리눅스 멀티스레드 파일 공유 프로그램 - 5 (0) | 2024.06.08 |
리눅스 멀티스레드 파일 공유 프로그램 - 4 (0) | 2024.06.08 |
리눅스 멀티스레드 파일 공유 프로그램 - 2 (0) | 2024.06.07 |
리눅스 멀티스레드 파일 공유 프로그램 - 1 (1) | 2024.06.07 |
Comments