- 전체
- C/C++ 일반
- C/C++ 수학
- C/C++ 그래픽
- C/C++ 자료구조
- C/C++ 인공지능
- C/C++ 인터넷
- wxWidget
- GTK+
- UNIX or LINUX programming
- 리눅스 마스터 - 국가공인자격
- VC++/ MFC
- C#/CLI/.NET
- QT/기타UI
- Boost lib
- 오픈소스 C 분석자료
- MSA (마이크로서비스), Docker, kubernetes
- WSL(windows subsystem linux)
VC++/ MFC VC++ : windows : TCPIP SOCKET SERVER and CLIENT
2014.02.18 10:45
VC++ : windows : TCPIP SOCKET SERVER and CLIENT
SERVER
#define WIN32_LEAN_AND_MEAN #include <WinSock2.h> #include <WS2tcpip.h> #include <stdio.h> #include <stdlib.h> // link with Ws2_32.lib #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFFER_LENGTH 512 int main() { WSADATA wsaData; // Initialize Winsock int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } struct addrinfo *result = NULL, hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; // Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned hints.ai_socktype = SOCK_STREAM; // Requests the socket type to be a stream socket for the TCP protocol hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the local address and port to be used by the server iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; } SOCKET ListenSocket = INVALID_SOCKET; // Create a SOCKET for the server to listen for client connections ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %d\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } // Setup the TCP listening socket iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed: %d", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); // To listen on a socket if ( listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) { printf("listen failed: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } SOCKET ClientSocket; ClientSocket = INVALID_SOCKET; // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } char recvbuf[DEFAULT_BUFFER_LENGTH]; int iSendResult; // reveice until the client shutdown the connection do { iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0); if (iResult > 0) { char msg[DEFAULT_BUFFER_LENGTH]; memset(&msg, 0, sizeof(msg)); strncpy(msg, recvbuf, iResult); printf("Received: %s\n", msg); iSendResult = send(ClientSocket, recvbuf, iResult, 0); if (iSendResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } printf("Bytes sent: %ld\n", iSendResult); } else if (iResult == 0) printf("Connection closed\n"); else { printf("recv failed: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); //return 1; } } while (iResult > 0); // Free the resouces closesocket(ListenSocket); WSACleanup(); getchar(); return 0; } |
CLIENT
#define WIN32_LEAN_AND_MEAN #include <WinSock2.h> #include <WS2tcpip.h> #include <iostream> #include <string> // link with Ws2_32.lib #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFFER_LENGTH 512 class Client { public: Client(char* servername) { szServerName = servername; ConnectSocket = INVALID_SOCKET; } bool Start() { WSADATA wsaData; // Initialize Winsock int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return false; } struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Resolve the server address and port iResult = getaddrinfo(szServerName, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return false; } ptr = result; // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %d\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return false; } // Connect to server iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return false; } return true; }; // Free the resouces void Stop() { int iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); } closesocket(ConnectSocket); WSACleanup(); }; // Send message to server bool Send(char* szMsg) { int iResult = send(ConnectSocket, szMsg, strlen(szMsg), 0); if (iResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); Stop(); return false; } return true; }; // Receive message from server bool Recv() { char recvbuf[DEFAULT_BUFFER_LENGTH]; int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0); if (iResult > 0) { char msg[DEFAULT_BUFFER_LENGTH]; memset(&msg, 0, sizeof(msg)); strncpy(msg, recvbuf, iResult); printf("Received: %s\n", msg); return true; } return false; } private: char* szServerName; SOCKET ConnectSocket; }; int main(int argc, CHAR* argv[]) { std::string msg; Client client("127.0.0.1"); if (!client.Start()) return 1; while(true) { std::cout << "Send: "; std::getline(std::cin, msg); // Close the connection when user enter "close" if (msg.compare("close") == 0) { break; } client.Send((char*)msg.c_str()); client.Recv(); } client.Stop(); getchar(); return 0; } |
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 13 |
[WSL2] 외부에서 WSL2 접속하기 (feat. 포트포워딩)
| 졸리운_곰 | 2024.12.01 | 307 |
| 12 |
[WSL2] Windows 11 WSL2 이용한 SSH & RStudio Server 설치 및 내·외부에서 접속
| 졸리운_곰 | 2023.11.06 | 336 |
| 11 |
[WSL2] Windows 11 WSL2 이용한 Python Jupyter 설치 및 내·외부에서 접속
| 졸리운_곰 | 2023.11.06 | 322 |
| 10 |
[WSL2] WSL2 외부 접속 설정
| 졸리운_곰 | 2023.06.26 | 368 |
| 9 |
[WSL2] Mysql 자동실행 설정하기
| 졸리운_곰 | 2023.06.25 | 280 |
| 8 |
[WSL2] 윈도우에서 linux 사용 (WSL 2), xwindows GUI 설정
| 졸리운_곰 | 2023.01.28 | 386 |
| 7 |
[WSL2] Windows 11의 WSL2에서 리눅스 X Window 응용프로그램 실행하기
| 졸리운_곰 | 2023.01.28 | 287 |
| 6 |
[WSL2] WSL에서의 Jupyter notebook 사용하기.
| 졸리운_곰 | 2022.11.27 | 477 |
| 5 | [WSL] WSL 배포판 복사하기 | 졸리운_곰 | 2022.10.30 | 318 |
| 4 | [WSL] 백업방법, WSL 내보내기, 가져오기 [WSL2] 내보내기 및 가져오기 | 졸리운_곰 | 2022.10.30 | 277 |
| 3 |
[WSL] WSL2[4] - SSH 접속하기
| 졸리운_곰 | 2022.09.25 | 370 |
| 2 |
[WSL] WSL2 딥러닝 환경 구축하기 (CUDA, CuDNN, Anaconda)
| 졸리운_곰 | 2022.09.04 | 387 |
| 1 |
[WSL] WSL에서의 Jupyter notebook 사용하기.
| 졸리운_곰 | 2022.09.04 | 343 |

