#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)
댓글 없음:
댓글 쓰기