#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#pragma comment(lib,"wsock32.lib")
#define PORT 2020
#define CONN_IP "127.0.0.1"
int main(void){
// WSAStartup
// 소켓버전을 받음
WSADATA wsaData;
if(WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ){
printf("WSAStartup 실패, 에러코드 = %u\n",WSAGetLastError());
return false;
}else{
printf("WSAStartup 성공\n");
}
// socket
// 소켓디스크립터
SOCKET s;
// TCP/IP용 소켓생성
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET){
printf("소켓 생성 실패, 에러코드 : %u\n",WSAGetLastError());
WSACleanup();
return false;
}else{
printf("소켓 생성 성공\n");
}
// setsockopt (SO_RCVBUF)
// 1Mbytes 의 수신버퍼
int nBufLen = 1048576;
// 옵션 변수의 길이
int size =sizeof(int);
if( setsockopt(s, SOL_SOCKET,SO_RCVBUF, (char*)&nBufLen, size) != 0){
printf("소켓 수신 버퍼 크기 설정 실패, 에러코드 = %u\n",WSAGetLastError());
//소켓제거
closesocket(s);
WSACleanup();
return false;
}else{
printf("소켓 수신 버퍼 크기 설정 성공\n");
}
//* 바인드는 필요에 따라 사용
// bind
SOCKADDR_IN addr_bind;
// AF_INET 체계임을 명시
addr_bind.sin_family = AF_INET;
// 설정된 포트를 사용
addr_bind.sin_port = htons(PORT+1);
// 기본네트워크 카드 설정
addr_bind.sin_addr.s_addr = htonl(ADDR_ANY);
if( bind(s, (LPSOCKADDR)&addr_bind, sizeof(addr_bind)) == SOCKET_ERROR){
printf("바인드 실패, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}else{
printf("바인드 성공\n");
}
//*/
// connect
// 소켓 구조체
SOCKADDR_IN serv_addr;
// 주소 체계 설정
serv_addr.sin_family = AF_INET;
// 설정된 포트를 사용
serv_addr.sin_port = htons(PORT);
// 접속주소 설정
serv_addr.sin_addr.s_addr = inet_addr(CONN_IP);
printf("접속 중...\n");
if( connect(s, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR){
printf("접속 실패, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}else{
printf("접속 성공\n");
}
printf("접속 완료!!!\n");
// getsockname
SOCKADDR_IN cli_addr;
size = sizeof SOCKADDR_IN;
if( getsockname(s, (LPSOCKADDR)&cli_addr, &size) == SOCKET_ERROR){
printf("로컬 정보 얻기 실패, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}else{
printf("로컬 정보 얻기 성공\n");
}
printf("로컬 접속 IP : %s, 포트 : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
// send
char buf[8] = "Hello";
int len = 5;
int ret;
ret = send(s,buf,len,0);
if(ret == SOCKET_ERROR){
printf("데이터 송신 실패, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}
// recv
ret = recv(s,buf,len,0);
if(ret == SOCKET_ERROR){
printf("소켓 통신 오류 발생, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}
printf("수신 데이터 = %s (%d bytes)\n",buf,ret);
// shutdown
if(shutdown(s, SD_BOTH) != 0){
printf("안전 종료 실패, 에러코드 = %u\n",WSAGetLastError());
// 소켓제거
closesocket(s);
WSACleanup();
return false;
}else{
printf("안전 종료 성공\n");
}
if(closesocket(s) != 0){
printf("소켓 제거 실패, 에러코드 = %u\n",WSAGetLastError());
WSACleanup();
return false;
}else{
printf("소켓 제거 성공\n");
}
// WSACleanup
if(WSACleanup() != 0){
printf("WSACleanup 실패, 에러코드 = %u\n",WSAGetLastError());
return false;
}else{
printf("WSACleanup 성공\n");
}
return true;
}
13. 6. 14.
C++(Windows) TCP 클라이언트
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기