#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
//#include<arpa/inet.h>
#define BUFSIZE 1024
void ErrorHandling(const char* message);
int main(int argc, char** argv) {
SOCKET clntSock; // 소켓 생성
WSADATA wsaData;
SOCKADDR_IN servAddr;
char sAddr[15];
int sPort;
int nRcv;
unsigned int Addr;
char message[BUFSIZE];
char message2[BUFSIZE];
struct hostent* host;
FILE* fp;
size_t len;
fp = NULL;
fp = fopen("C:/Users/94hsk/Desktop/lena.jpg", "rb");
if (fp == NULL)
ErrorHandling("Image Read Fail");
printf("Server Address : "); gets_s(sAddr, sizeof(sAddr)); /// gets_s함수는 입력을 받는 함수로
printf("Port Number : "); gets_s(message, sizeof(message)); // 해당 크기만큼의 문자열을 받아 저장한다.
sPort = atoi(message); // 문자열을 정수 타입으로 변경해주는 함수이다.
// 왜 변경하지?
// message에 문자가 들어가면 바로 0을 반환
// 문자가 숫자로 시작할 시 숫자 반환
// 숫자+문자의 경우 문자 나오기 전까지 숫자 반환
// 문자+숫자의 경우 0 반환
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) // 소캣 사용 전 초기화를 진행하고 초기화 정보를 wasData에 저장
ErrorHandling("Load WinSock 2.2 DLL Error"); // 초기화 성공하면 0 반환
clntSock = socket(AF_INET, SOCK_STREAM, 0); // socket(int domain, int Type, int protocol);
// 소캣을 생성한다.
// AF_INET 체계는 주소체계를 사용하며 IPv4인터넷 프로토콜 사용
if (clntSock == INVALID_SOCKET)
ErrorHandling("Socket Error");
memset(&servAddr, 0, sizeof(servAddr)); // memset 함수는 어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로
// 모두 지정하고 싶을때 사용하는 함수
// 채우고자 하는 메모리의 시작 주소 : servAddr
// 메모리에 채우고자 하는 값 : 0
// 채우고자 하는 메모리의 크기 : sizeof(servAddr)
//// SOCKADDR_IN 구조체의 객체 servAddr
//// 위의 구조체는 IPv4 주소를 저장하는 구조체이다.
//// 주소 체계, 포트 정보, IPv4 주소 등을 저장한다.
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(sAddr);
//// SOCKADDR_IN 구조체의 구조체변수 servAddr에 대해 설정을 진행한다.
//// sin_addr 값에는 IP주소를 나타내는 32비트 정수 탑이의 구조체가 들어간다.
//// 즉 입력받은 iP주소를 통해 통신을 설정해주는 부분이다.
void* dst;
int check;
//servAddr.sin_port = htons(sPort);
servAddr.sin_port = (sPort);
if (connect(clntSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {
ErrorHandling("Connection Error");
}
else {
printf("Connect OK!\nStart...\n");
}
while (1)
{
printf("sending\n");
len = fread(message2, sizeof(char), BUFSIZE-1, fp);
send(clntSock, message2, len, 0);
if (feof(fp))break;
}
printf("Sending Done! \n");
shutdown(clntSock, SD_SEND);
len = recv(clntSock, message2, BUFSIZE - 1, 0);
message2[len] = 0;
puts(message2);
fclose(fp);
closesocket(clntSock);
WSACleanup(); /// 소캣 종료
printf("Close Connection..\n");
return 0;
}
void ErrorHandling(const char* message) {
WSACleanup();
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}