TCP 소켓 통신 socket 생성에 문제가 있습니다.
글쓴이: l595659 / 작성시간: 금, 2022/07/08 - 12:26오후
MFC로 만들었던 TCP 소켓통신 프로그램을 Class화 시켜서 헤더와 cpp파일로 나눠서 테스트 해보고있습니다.
각 기능을 헤더에 정의하고 cpp의 main함수 안에서 실행을 시켰는데 socket()이 들어간 함수가 실행될땐 socket 값이 할당이 되는데 끝나고 나면 다시 socket이 0이 됩니다.
어떻게 수정해야할지 감을 못잡겠네요..
헤더
#pragma once #include "Winsock.h" #include <stdio.h> #include <vector> #include <atlstr.h> #pragma comment(lib, "ws2_32.lib") #define MAX_CLIENT_NUM 255 #define _CRT_SECURE_NO_WARNINGS class TCPServer { public: TCPServer(); ~TCPServer(); struct UserData { char Ip_Address[16]; char port[10]; char strConnTime[30]; //DB에 보낼 접속시간 변수 char strCloseTime[30]; }; UserData m_user_list[MAX_CLIENT_NUM + 1]; //---------------------------------------------------// CString slniPath; TCHAR ServerPort[MAX_PATH]; TCHAR ClientCount[MAX_PATH]; int index; int ServerPort_Num; int ClientCount_Num; int size; std::vector<SOCKET> client_list; std::vector<SOCKADDR_IN> udpClient_list; //---------------------------------------------------// void portClntCountInfo(CString iniLocation, CString serverSection, CString portKey, CString clientNumKey); int winsockInit(); void serverSocket(SOCKET servSock, int domain, int type, int protocol); void servSockAddr(SOCKADDR_IN serv_sockAddr, int domain); int beforeAccept(SOCKET servSock, SOCKADDR_IN serv_sockAddr, int ServSockAddrLen); void clntSockAddr(SOCKADDR_IN clnt_sockAddr, int domain); int clntAccept(SOCKET clntSock, SOCKET servSock, SOCKADDR_IN clnt_sockAddr); void multiClient(SOCKET clntSock, SOCKADDR_IN clnt_sockAddr); }; void TCPServer::portClntCountInfo(CString iniLocation, CString serverSection, CString portKey, CString clientNumKey) { //CString section; slniPath.Format(iniLocation); GetPrivateProfileString(serverSection, portKey, _T(""), ServerPort, MAX_PATH, slniPath); ServerPort_Num = _ttoi(ServerPort); GetPrivateProfileString(serverSection, clientNumKey, _T(""), ClientCount, MAX_PATH, slniPath); ClientCount_Num = _ttoi(ClientCount); } int TCPServer::winsockInit() { WSADATA wsaData; if (int retval = WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) printf("winsockInit() Error"); return 0; } void TCPServer::serverSocket(SOCKET servSock, int domain, int type, int protocol) { servSock = socket(domain, type, protocol); if (servSock == SOCKET_ERROR) { printf("ServerSocket() Error"); } } void TCPServer::servSockAddr(SOCKADDR_IN serv_sockAddr, int domain) { serv_sockAddr = { 0 }; serv_sockAddr.sin_family = domain; serv_sockAddr.sin_port = htons(ServerPort_Num); serv_sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); } int TCPServer::beforeAccept(SOCKET servSock, SOCKADDR_IN serv_sockAddr, int ServSockAddrLen) { if (bind(servSock, (SOCKADDR*)&serv_sockAddr, ServSockAddrLen) == SOCKET_ERROR) { printf("ServerBind() Error"); return 0; } listen(servSock, ClientCount_Num); } void TCPServer::clntSockAddr(SOCKADDR_IN clnt_sockAddr, int domain) { clnt_sockAddr = { 0 }; clnt_sockAddr.sin_family = domain; clnt_sockAddr.sin_port = htons(ServerPort_Num); clnt_sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); size = sizeof(SOCKADDR_IN); } int TCPServer::clntAccept(SOCKET clntSock, SOCKET servSock, SOCKADDR_IN clnt_sockAddr) { clntSock = accept(servSock, (SOCKADDR*)&clnt_sockAddr, &size); if (clntSock == SOCKET_ERROR) { printf("clntAccept() Error"); return 0; } }
cpp파일 입니다.
#include <iostream> #include "ServerClass.h" TCPServer::TCPServer() {}; TCPServer::~TCPServer() {}; SOCKET server_sock; //샘플 SOCKADDR_IN serv_socketAddr; //샘플 SOCKET clnt_sock; SOCKADDR_IN clnt_socketAddr; int main() { TCPServer tcpserver; tcpserver.portClntCountInfo(_T("./NetworkPath.ini"), _T("ServerInfo"), _T("Port"), _T("ClientCount")); tcpserver.winsockInit(); tcpserver.serverSocket(server_sock, AF_INET, SOCK_STREAM, 0); tcpserver.servSockAddr(serv_socketAddr, AF_INET); tcpserver.beforeAccept(server_sock, serv_socketAddr, sizeof(SOCKADDR)); while (1) { #if 1 tcpserver.clntSockAddr(clnt_socketAddr, AF_INET); #endif tcpserver.clntAccept(clnt_sock, server_sock, clnt_socketAddr); if (clnt_sock == SOCKET_ERROR) { break; } tcpserver.multiClient(clnt_sock, clnt_socketAddr); } }
Forums:
함수 인자 전달방법이 어떤것들이 있는지 알아보시면
함수 인자 전달방법이 어떤것들이 있는지 알아보시면 좋겠습니다.
댓글 달기