728x90
반응형
파일전송이 가능한 클라이언트와 서버 프로그램 만들기
파일전송 서버에 있는 1.txt파일을 클라이언트에게 보내기 위해 각각의 exe파일을 실행시킨다.
현재 클라이언트 폴더에는 파일이 없는 상태
실행을 시키면 다음과 같은 실행창이 뜨며 파일이 옮겨진다.
↓서버 프로그램 창
↓클라이언트 프로그램 창
FTP 서버 프로그램 코드
더보기
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "MySocketError.h"
#define SERVER_IP "49.142.21.31"
#define SERVER_PORT 1234
#define BUF_SIZE 100
#pragma comment(lib,"ws2_32.lib")
int main(void)
{
int result = -1;
//WSAStartup
WSADATA wData = { 0 };
result = WSAStartup(MAKEWORD(2, 2), &wData);
if (result) ErrorExit("WSAStartup");
else OKMsg("WSAStartup");
//socket
SOCKET serverSocket;
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) ErrorExit("socket");
else OKMsg("socket");
//bind
SOCKADDR_IN serverAddress = { 0 };
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(SERVER_PORT); //1~65535
serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);
result = bind(serverSocket, (SOCKADDR*)&serverAddress, sizeof(serverAddress));
if (result == SOCKET_ERROR) ErrorMsg("bind");
else OKMsg("bind");
//문자열 -> long
/* inet_pton 2
result = inet_pton(AF_INET, SERVER_IP, &(serverAddress.sin_addr));
if (result == SOCKET_ERROR) ErrorMsg("inet_pton");
else OKMsg("inet_pton");
*/
//inetpton 3
result = InetPton(AF_INET, SERVER_IP, &serverAddress.sin_addr);
if (result == SOCKET_ERROR) ErrorMsg("InetPton");
else OKMsg("InetPton");
//listen
result = listen(serverSocket, 5);
if (result == SOCKET_ERROR) ErrorMsg("listen");
else OKMsg("listen");
//accept
SOCKET clientSocket;
SOCKADDR_IN clientAddress = { 0 };
int sizeClientAddress = sizeof(clientAddress);
clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddress, &sizeClientAddress);
if (clientSocket == INVALID_SOCKET) ErrorMsg("accept");
else OKMsg("accept");
char clientIP[20] = { 0 };
//inet_ntop(AF_INET, &(clientAddress.sin_addr), clientIP, 20); //Inet_Ntop 2
InetNtop(AF_INET, &(clientAddress.sin_addr), clientIP, 20); //InetNtop 3
printf("client(IP:%s, PORT:%d)accept\n"
, clientIP //, inet_ntoa(clientAddress.sin_addr)
, ntohs(clientAddress.sin_port));
/*데이터송수신 -시작*/
FILE* fileIn = 0, * fileOut = 0;
// 1.txt reading
result = fopen_s(&fileIn, "1.txt", "rb"); //b=binary
if (result)
{
printf("[fopen_s reading] ERROR\n");
return -1;
}
else
{
printf("[fopen_s reading] SUCCESS\n");
}
// 1.txt copy
result = fopen_s(&fileOut, "1copy.txt", "wb");
if (result)
{
printf("[fopen_s writing] ERROR\n");
return -1;
}
else
{
printf("[fopen_s writing] SUCCESS\n");
}
// 터미널 출력
printf("\n");
char buf[BUF_SIZE] = { 0 };
while (1) //100 byte를 read
{
memset(buf, 0, sizeof(char) * BUF_SIZE);
if (feof(fileIn))
{
printf("End Of File\n");
break;
}
result = fread(buf, sizeof(char), BUF_SIZE, fileIn);
result = send(clientSocket, (char*)buf, result, 0);
if (result == SOCKET_ERROR) ErrorMsg("send");
else OKMsg("send");
fwrite(buf, sizeof(char), result, fileOut);
}
printf("\n\n");
// close
result = fclose(fileIn);
if (result)
{
printf("[file closing | reading] ERROR\n");
return -1;
}
else
{
printf("[file closing | reading] SUCCESS\n");
}
result = fclose(fileOut);
if (result)
{
printf("[file closing | writing] ERROR\n");
return -1;
}
else
{
printf("[file closing | writing] SUCCESS\n");
}
/*데이터송수신 -끝*/
//closesocket
result = closesocket(clientSocket);
if (result == SOCKET_ERROR) ErrorMsg("closesocket");
else OKMsg("closesocket");
//closesocket
result = closesocket(serverSocket);
if (result == SOCKET_ERROR) ErrorMsg("closesocket");
else OKMsg("closesocket");
//WSACleanup
result = WSACleanup();
if (result == SOCKET_ERROR) ErrorMsg("WSACleanup");
else OKMsg("WSACleanup");
getchar();
return 0;
}
FTP 클라이언트 프로그램 코드
더보기
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "MySocketError.h"
#define SERVER_IP "49.142.21.31"
#define SERVER_PORT 1234
#define BUF_SIZE 100
#pragma comment(lib,"ws2_32.lib")
int main(void)
{
//WSAStartup
//socket
//connect -소켓 안에 IP/PORT/Family 정보를 넣고 서버와 연결
//closesocket
//WSACleanup
int result = -1231432;
//WSAStartup
WSADATA wData = { 0 };
result = WSAStartup(MAKEWORD(2, 2), &wData);
if (!result) OKMsg("WSAStartup");
else ErrorExit("WSAStartup");
//socket
SOCKET clientSocket;
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) ErrorExit("socket");
else OKMsg("socket");
//connect
SOCKADDR_IN serverAddress = { 0 };
serverAddress.sin_family = PF_INET;
serverAddress.sin_port = htons(SERVER_PORT);
//serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);
// result = inet_pton(AF_INET, SERVER_IP, &(serverAddress.sin_addr)); //2)inet_pton
result = InetPton(AF_INET, SERVER_IP, &(serverAddress.sin_addr)); //3)InetPton
if (result == SOCKET_ERROR) ErrorMsg("inet_pton");
else OKMsg("inet_pton");
result = connect(clientSocket, (SOCKADDR*)&serverAddress, sizeof(serverAddress));
if (result == SOCKET_ERROR) ErrorMsg("connect");
else OKMsg("connect");
//data send/recv
FILE* fileOut = 0;
result = fopen_s(&fileOut, "1.txt", "wb");
char buf[BUF_SIZE] = { 0 };
while (1)
{
memset(buf, 0, BUF_SIZE);
result = recv(clientSocket, (char*)buf, BUF_SIZE, 0);
if (!result)
{
printf("disconnect(socket closing)\n");
break;
}
if (result == SOCKET_ERROR) ErrorMsg("recv");
else OKMsg("recv");
fwrite(buf, sizeof(char), result, fileOut);
}
fclose(fileOut);
//closesocket
result = closesocket(clientSocket);
if (result == SOCKET_ERROR) ErrorMsg("closesocket");
else OKMsg("closesocket");
//WSACleanup
result = WSACleanup();
if (result == SOCKET_ERROR) ErrorMsg("WSACleanup");
else OKMsg("closesocket");
getchar();
return 0;
}
728x90
반응형