- 전체
- 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
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 2 |
[C/C++][gnuplot][수학][MFC] Windows 환경의 C++ 언어에서 gnuplot을 사용한 그래프 출력 2
| 졸리운_곰 | 2021.11.12 | 733 |
| 1 |
[C/C++][gnuplot][수학][MFC] Windows 환경의 C++ 언어에서 gnuplot을 사용한 그래프 출력
| 졸리운_곰 | 2021.11.12 | 1776 |

