#define BUFSIZE 1024
#define PORT 3000
#define IP "192.168.2.12"
// 해더파일 선언
#include <winsock2.h>
#include <iostream>
using namespace std;
// ws2_32.lib 링크
#pragma comment(lib, "ws2_32.lib")
class socketClient
{
private:
WSADATA wsaData;
SOCKET hSocket;
char message[BUFSIZE];
int strLen;
SOCKADDR_IN servAddr;
void ErrorHandling(char *message);
public:
int StartClient();
};
int socketClient::StartClient()
{
// 윈속 초기화 (성공시 0, 실패시 에러 코드리턴)
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
ErrorHandling("WSAStartup() error!");
}
// 소켓 생성 (성공시 핸들을, 실패시 "INVALID_SOCKET" 반환)
hSocket=socket(PF_INET, SOCK_STREAM, 0);
// 소켓 생성 실패 처리
if(hSocket == INVALID_SOCKET){
ErrorHandling("socket() error");
}
// 매모리 초기화
memset(&servAddr, 0, sizeof(servAddr));
// 소켓 통신을 위한 기본 정보
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(IP);
servAddr.sin_port=htons(PORT);
// 서버 커넥트
if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR){
ErrorHandling("connect() error!");
}
// 루프
while(1) {
cout<<"전송할 메시지를 입력하세요 (q to quit) : ";
cin>>message;
// q신호 일때 소켓을 끝냄
if(!strcmp(message,"q")) break;
// 메시지전송
send(hSocket, message, (int)strlen(message), 0);
// 메시지 수신
strLen=recv(hSocket, message, BUFSIZE-1, 0); /* 메시지 수신 */
// 받은 값의 끝에 널값을 붙임.
message[strLen]=0;
cout << message <<endl;
}
// 소켓 종류 신호전송
closesocket(hSocket);
// 할당 받은 리소스 반환.
WSACleanup();
return 0;
}
void socketClient::ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
/************************************
/*
/* main
/*
*/
int main(){
// 서버 인스턴트
socketClient client;
// 서버시작
client.StartClient();
}