목차
- 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)
[C/C++] 파일 크기 구하기 예제(fseek, ftell)
목차 파일 열기 관련 예제 이전 포스팅 fopen으로 크기를 확인할 파일 열기 예제 fseek로 파일 끝까지 이동 예제 ftell로 파일 크기 구하기 예제 파일 열기 관련 예제 이전 포스팅 C언어에서 파일 크
salguworld.tistory.com
TCP 서버 소켓 파일 데이터 수신 및 저장하기 이전 포스팅
마지막으로 오늘 포스팅에서 클라이언트가 전송할 파일 데이터를 받아 로컬에 저장할 서버 프로그램이 필요합니다. 이전 포스팅에서 다뤘던 서버 코드를 이용하여 실행해주세요.
2023.08.09 - [C] - [C/C++] TCP 소켓 파일 주고 받기 예제 - 1(서버)
[C/C++] TCP 소켓 파일 주고 받기 예제 - 1(서버)
목차 C 언어 TCP 서버 소켓 예제 이전 포스팅 malloc 동적 메모리 할당 관련 예제 이전 포스팅 파일의 크기를 읽고 버퍼 할당하기 예제 할당한 버퍼에 파일 데이터 저장 예제 저장된 파일 확인 C 언
salguworld.tistory.com
서버에 보낼 파일의 크기 전송하기 예제
아래는 로컬 파일의 총 크기를 구하여 서버에 파일 크기 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;
}