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:


함수 인자 전달방법이 어떤것들이 있는지 알아보시면
함수 인자 전달방법이 어떤것들이 있는지 알아보시면 좋겠습니다.
댓글 달기