TCP 소켓 통신 socket 생성에 문제가 있습니다.

l595659의 이미지

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);
 
	}
 
 
}
Anti-Lock의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.