I am so utterly confused.
I haven't used winsock in a while, and I wanted to make a project to get back into it so I made one, called it Krabz and opened up MSDN ( I don't know why I called it Krabz, but I did ).
Now I've got code that to my knowledge should accept one connection, however it accepts no connection-at all. I've tried a lot of different modifications to it and I really have decided I just need some help. For some reason WSAStartup fails, according to my error checking, but when I look at the return value it's 0...which is supposed to mean it's not having an error? At least, that's my assumption! (MSDN said not to call wsagetlasterror so I didn't, and checked the actual return value, which it MSDN said nothing about a 0.)
After that all of my error-checking pops up, so clearly something is wrong but I don't know what.
KrabsChatServer.h
Code:
#ifndef KRABCHATSERVER_H_
#define KRABCHATSERVER_H_
#ifndef WIN32_LEAN_AND_MEAN // Don't include Winsock 1.1 header
#define WIN32_LEAN_AND_MEAN // from windows.h
#endif
#include <windows.h>
#include <tchar.h>
#include <string>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
class KrabChatServer
{
private:
WSADATA m_wsaData;
SOCKET m_listenSocket;
SOCKET m_clientSocket; // eventually become an array
struct addrinfo *m_initServerResult,
*m_initServerPtr,
m_initServerHints;
public:
KrabChatServer(void);
~KrabChatServer(void);
bool initWinsock();
bool initServer(std::string port);
bool beginListen();
bool beginAccept();
bool shutDownCon();
bool shutDownCon(SOCKET shutDownSocket);
bool shutDownWinsock();
/*int validate() {
if ( m_clientSocket == INVALID_SOCKET )
{
return 1;
}
else
{
return 0;
}
return 1;
}*/
};
#endif KRABCHATSERVER_H_
KrabzChatServer.cpp
Code:
#include "KrabChatServer.h"
KrabChatServer::KrabChatServer(void)
{
// Initialize some sockets
m_listenSocket = INVALID_SOCKET;
m_clientSocket = INVALID_SOCKET;
// Initialize addrinfo
m_initServerResult = NULL;
m_initServerPtr = NULL;
}
KrabChatServer::~KrabChatServer(void)
{
}
bool KrabChatServer::initWinsock()
{
// Initialize winsock
if ( !WSAStartup(MAKEWORD(2, 2), &m_wsaData) )
{
// Failed to initialize winsock
MessageBox(NULL, _T("Failed to initialize winsock 2.2"),
_T("Error!"), MB_OK);
return false;
}
// Success
return true;
}
bool KrabChatServer::initServer(std::string port)
{
// Initialize the memory to zero
ZeroMemory( &m_initServerHints, sizeof(m_initServerHints));
// Set the properties of the connections the server will accept
m_initServerHints.ai_family = AF_INET;
m_initServerHints.ai_socktype = SOCK_STREAM;
m_initServerHints.ai_protocol = IPPROTO_TCP;
m_initServerHints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
if (!getaddrinfo(NULL, port.c_str(), &m_initServerHints, &m_initServerResult))
{
// getaddrinfo failed
MessageBox(NULL, _T("getaddrinfo failed!"),
_T("Error!"), MB_OK);
WSACleanup();
return false;
}
// Success
return true;
}
bool KrabChatServer::beginListen()
{
// Begin listening on m_listenSocket
m_listenSocket = socket(m_initServerResult->ai_family,
m_initServerResult->ai_socktype,
m_initServerResult->ai_protocol);
// Success
return true;
}
bool KrabChatServer::beginAccept()
{
// Begin to accept connections
// REVAMP: revamp this later to be it's own thread & while-looped
m_clientSocket = accept(m_listenSocket, NULL, NULL);
if (m_clientSocket == INVALID_SOCKET)
{
// failed to accept socket
MessageBox(NULL, _T("Accept socket failed!"),
_T("Error!"), MB_OK);
closesocket(m_listenSocket);
WSACleanup();
return false;
}
// Success
return true;
}
bool KrabChatServer::shutDownCon()
{
if ( shutdown(m_clientSocket, SD_SEND) == SOCKET_ERROR )
{
// Failed to shut down socket
MessageBox(NULL, _T("Failed to shut down socket, closing m_clientSocket..."),
_T("Error!"), MB_OK);
closesocket(m_clientSocket);
WSACleanup();
return false;
}
// Success
return true;
}
bool KrabChatServer::shutDownCon(SOCKET shutDownSocket)
{
// Shuts down the connection
if ( shutDownSocket == INVALID_SOCKET )
{
// Invalid socket!
MessageBox(NULL, _T("Attempted to shut down an invalid socket..."),
_T("Error!"), MB_OK);
return false;
}
if ( shutdown(shutDownSocket, SD_SEND) == SOCKET_ERROR )
{
// Failed to shut down socket
MessageBox(NULL, _T("Failed to shut down socket, closing m_clientSocket..."),
_T("Error!"), MB_OK);
closesocket(m_clientSocket);
WSACleanup();
return false;
}
// Success
return true;
}
bool KrabChatServer::shutDownWinsock()
{
// Cleans up winsock
closesocket(m_clientSocket);
WSACleanup();
// Success
return true;
}
main.cpp
Code:
// krabz.cpp
#ifndef WIN32_LEAN_AND_MEAN // Don't include Winsock 1.1 header
#define WIN32_LEAN_AND_MEAN // from windows.h
#endif
#include <windows.h>
#include <tchar.h>
#include "KrabChatServer.h"
#include "KrabChatServerInterface.h"
#include "KrabChatClient.h"
#include "KrabChatClientInterface.h"
// The windowclass and title
static TCHAR szWindowClass[] = _T("KMain");
static TCHAR szTitle[] = _T("Krabz Chat");
// Create a server instance
KrabChatServer kcs;
// WndProc function to handle messages from the OS
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Member variables we need to properly maintain our window
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: add draw code here
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
kcs.shutDownCon();
kcs.shutDownWinsock();
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
// We should handle this
break;
case WM_RBUTTONDOWN:
// We should handle this
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
// Initialize Winsock
kcs.initWinsock();
// Initalize the server
kcs.initServer("80");
// Begin to listen on the server
kcs.beginListen();
// Accept any possible connections
//while ( kcs.validate() == 1 )
kcs.beginAccept();
// Shut down in WndProc
// Create a WNDCLASSEX structure for our window
WNDCLASSEX wcex;
// Fill in the WNDCLASSEX structure
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
// Register the WNDCLASSEX structure
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL, _T("Failed to register WNDCLASSEX structure!"), _T("Error!"),
MB_OK);
return 1;
}
// Create the actual window
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
420, 360,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
MessageBox(NULL, _T("Failed to CreateWindow!"), _T("Error!"), MB_OK);
return 1;
}
// Display the window
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
// Create the message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
I hate to post so much code like that, but, I'm totally clueless as to what's wrong, I'm linking with the WS2_32.lib, I've put the WS2_32.dll file in every directory in my project and I'm using Visual C++ 2008 Express addition to do it. Any ideas at all? (Watch it be something simple and I'm just an idiot!)