목차
- C 언어 TCP 클라이언트 소켓 예제 이전 포스팅
- fseek 파일 총 크기 가져오기 예제 이전 포스팅
- TCP 서버 소켓 파일 데이터 수신 및 저장하기 이전 포스팅
- 서버에 보낼 파일의 크기 전송하기 예제
- 파일 크기만큼 데이터 전송하기 예제
C 언어 TCP 클라이언트 소켓 예제 이전 포스팅
오늘 다루는 포스팅은 이전 포스팅에서 다뤘던 파일 데이터를 수신하여 로컬에 저장하는 서버 소켓 포스팅의 클라이언트 버전입니다. 우선 C 언어로 클라이언트 소켓을 생성하여 서버에 연결하고 메세지를 전송하는 방법에 대해 잘 알아야합니다.
아래는 C언어 TCP 클라이언트 소켓 생성 및 메세지 전송 관련 예제 포스팅 링크입니다.
2023.08.13 - [Python/os] - [Python] socket TCP 클라이언트 생성하여 메세지 전송하기(TCP)
fseek 파일 총 크기 가져오기 예제 이전 포스팅
다음은 보낼 파일의 총 크기를 구하는 방법을 알아야합니다. 이전에 fopen, fseek, ftell 함수를 통해 파일의 총 크기를 확인하는 포스팅을 작성하였습니다. 아래 링크를 통해 확인해주세요.
2023.08.09 - [C] - [C/C++] 파일 크기 구하기 예제(fseek, ftell)
TCP 서버 소켓 파일 데이터 수신 및 저장하기 이전 포스팅
마지막으로 오늘 포스팅에서 클라이언트가 전송할 파일 데이터를 받아 로컬에 저장할 서버 프로그램이 필요합니다. 이전 포스팅에서 다뤘던 서버 코드를 이용하여 실행해주세요.
2023.08.09 - [C] - [C/C++] TCP 소켓 파일 주고 받기 예제 - 1(서버)
서버에 보낼 파일의 크기 전송하기 예제
아래는 로컬 파일의 총 크기를 구하여 서버에 파일 크기 4byte 메세지를 전송하는 예제입니다. 서버는 이 값을 읽어 뒤에 오는 파일 데이터가 얼만큼 있는지, 그리고 내가 얼마나 읽어야하는지 알 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int fileSize;
{
FILE *file;
const char *filename = "/tmp/test.txt";
// 파일 열기
file = fopen(filename, "rb");
if (file == NULL) {
printf("파일 열기 오류");
return 1;
}
// 파일 포인터를 파일 끝으로 이동
if (fseek(file, 0, SEEK_END) != 0) {
printf("파일 포인터 이동 오류");
fclose(file);
return 1;
}
// 파일의 현재 위치를 구해서 파일 크기를 얻기
long file_size = ftell(file);
if (file_size == -1) {
printf("파일 크기 구하기 오류");
fclose(file);
return 1;
}
printf("파일 크기: %ld 바이트\n", file_size);
// 파일 닫기
fclose(file);
}
// 소켓 생성
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == -1) {
printf("소켓 생성 실패");
return 1;
}
// 서버 정보 설정
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(9999);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
// 서버에 연결
if (connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) {
printf("연결 실패");
return 1;
} else {
printf("연결 성공\n");
}
// 파일 크기 메시지 전송
if (send(clientSocket, &fileSize, sizeof(fileSize), 0) == -1) {
printf("파일 크기 전송 실패\n");
return 1;
}
close(clientSocket);
return 0;
}
파일 크기만큼 데이터 전송하기 예제
파일크기를 전송한 이후에는 이제 파일 데이터를 전송합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
unsigned char *buf;
int fileSize;
{
FILE *file;
const char *filename = "/tmp/test.txt";
// 파일 열기
file = fopen(filename, "rb");
if (file == NULL) {
printf("파일 열기 오류");
return 1;
}
// 파일 포인터를 파일 끝으로 이동
if (fseek(file, 0, SEEK_END) != 0) {
printf("파일 포인터 이동 오류");
fclose(file);
return 1;
}
// 파일의 현재 위치를 구해서 파일 크기를 얻기
long file_size = ftell(file);
if (file_size == -1) {
printf("파일 크기 구하기 오류");
fclose(file);
return 1;
}
printf("파일 크기: %ld 바이트\n", file_size);
buf = malloc(file_size + 1);
memset(buf, 0, file_size + 1);
fseek(file, 0, SEEK_SET);
fgets(buf, file_size, file);
printf("text : %s\n", buf);
// 파일 닫기
fclose(file);
}
// 소켓 생성
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == -1) {
printf("소켓 생성 실패");
return 1;
}
// 서버 정보 설정
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(9999);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
// 서버에 연결
if (connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) {
printf("연결 실패");
return 1;
} else {
printf("연결 성공\n");
}
// 파일 크기 메시지 전송
if (send(clientSocket, &fileSize, sizeof(fileSize), 0) == -1) {
printf("파일 크기 전송 실패\n");
return 1;
}
// 텍스트 파일 내용 전송
if (send(clientSocket, buf, fileSize, 0) == -1) {
printf("텍스트 파일 내용 전송 실패\n");
return 1;
}
close(clientSocket);
return 0;
}
반응형