TCP/IP 네트워크 클라이언트 통신을위한 클래스를 작성 중입니다. 클래스 헤더에 SOCKET 멤버를 만듭니다. 이 클래스에는 WSAStartup을 호출하고 버전을 확인하는 메서드가 포함되어 있습니다. 연결을 만드는 메서드는 먼저 WSAStartup을 호출 한 다음 socket() 함수를 호출하는 SOCKET 멤버를 초기화합니다. 아래 코드를 참조하십시오. 이것이 올바른지 또는 더 좋은 방법이 있는지 궁금합니다.WSAStartup()을 호출하기 전에 소켓의 인스턴스를 만들 수 있습니까?
헤더 파일 :
/*network.h*/
public class IPnetwork
{
private:
WSADATA wsaData ;
SOCKET hSocket ;
sockaddr_in socketAddress ;
static const int SERVER_PORT = 502 ;
unsigned long int = serverIP ;
public:
IPnetwork(char* serverIPaddress) ;
bool Connect() ;
bool Disconnect() ;
~IPnetwork() ;
private:
bool startWinSock() ;
} ;
소스 코드 :
/*network.cpp*/
IPnetwork::IPnetwork(char* serverIPaddress)
{
serverIP = inet_addr(serverIPaddress) ;
}
bool IPnetwork::Connect()
{
/* start winsock */
if(!startWinSock())
{
return false ; /* winsock problem */
}
/* Create socket */
if ((hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
return false ; /* could not create socket */
}
/* fill socket address structure */
socketAddress.sin_family = AFINET ;
socketAddress.sin_port = htons(SERVER_PORT) ;
socketAddress.sin_addr.S_un.S_addr = serverIP ;
/* connect */
if(connect(hSocket,reinterpret_cast<sockaddr*>(&socketAddress), sizeof(sockAddr))!=0)
{
return false ; /* could not connect*/
}
return true ;
}
bool IPnetwork::startWinSock()
{
if(WSAStartup(MAKEWORD(REQ_WINSOCK_VER,0),&wsaData)==0)
{
/* Check if major version is at least REQ_WINSOCK_VER */
if (LOBYTE(wsaData.wVersion) < REQ_WINSOCK_VER)
{
return false ; /* winsock started but version is too low */
}
else
{
return true ; /* winsock started with right version*/
}
}
else
{
return false ; /* winsock not started */
}
}
실제로 소켓을 생성하는'socket (...) '이며'SOCKET' 유형 생성자는 아닙니다. 그래서 너 괜찮아. –