时间比较匆忙, 写了一个简单的 websocket服务器,采用c++. 网络底层采用windows api.
等有空好好封装一下,让大家可以不关心细节,即可使用。
//------主文件main.cpp-----------------------
#include "../../WebSocket/WebSocket.h"
#include "stdio.h"
#include "winsock2.h"
#include "sockio.h"
#include "stdio.h"
#include "winsock2.h"
#include "sockio.h"
void main()
{
{
Server svr;
svr.WaitForClient();
//system("pause");
svr.WaitForClient();
//system("pause");
printf("press Enter to Exit!");
getchar();
}
getchar();
}
//----------------------------------------------------
//--------------sockio.h--------------------------
#ifndef SERVER_H
#define SERVER_H
#define SERVER_H
#include <Winsock2.h>
#include <windows.h>
#include "../../WebSocket/WebSocket.h"
#include <windows.h>
#include "../../WebSocket/WebSocket.h"
#pragma comment (lib, "ws2_32.lib")
#define IP_BUF_SIZE 129
class Server
{
public:
Server();
~Server();
Server(const Server &);
Server & operator=(const Server &);
void WaitForClient();
private:
WORD winsock_ver;
WSADATA wsa_data;
SOCKET sock_svr;
SOCKET sock_clt;
HANDLE h_thread;
SOCKADDR_IN addr_svr;
SOCKADDR_IN addr_clt;
int ret_val;
int addr_len;
TCHAR buf_ip[IP_BUF_SIZE];
public:
static WebSocket m_webSocket;
};
class Server
{
public:
Server();
~Server();
Server(const Server &);
Server & operator=(const Server &);
void WaitForClient();
private:
WORD winsock_ver;
WSADATA wsa_data;
SOCKET sock_svr;
SOCKET sock_clt;
HANDLE h_thread;
SOCKADDR_IN addr_svr;
SOCKADDR_IN addr_clt;
int ret_val;
int addr_len;
TCHAR buf_ip[IP_BUF_SIZE];
public:
static WebSocket m_webSocket;
};
#endif
//---------------------------------------------------------------------
//---------------------sockio.cpp----------------------------------
#include "sockio.h"
#include <iostream>
#include <WS2tcpip.h>
#include <WS2tcpip.h>
using std::cerr;
using std::cout;
using std::endl;
using std::cout;
using std::endl;
#define SERVER_PORT 80
#define MSG_BUF_SIZE 1024
#define MSG_BUF_SIZE 1024
WebSocket Server::m_webSocket;
Server::Server()
{
cout << "Initializing server...\n";
//
winsock_ver = MAKEWORD(2, 2);
addr_len = sizeof(SOCKADDR_IN);
addr_svr.sin_family = AF_INET;
addr_svr.sin_port = ::htons(SERVER_PORT);
addr_svr.sin_addr.S_un.S_addr = ADDR_ANY;
memset(buf_ip, 0, IP_BUF_SIZE);
//
ret_val = ::WSAStartup(winsock_ver, &wsa_data);
if (ret_val != 0)
{
cerr << "WSA failed to start up!Error code: " << ::WSAGetLastError() << "\n";
system("pause");
exit(1);
}
cout << "WSA started up successfully...\n";
//
sock_svr = ::socket(AF_INET, SOCK_STREAM, 0);
if (sock_svr == INVALID_SOCKET)
{
cerr << "Failed to create server socket!Error code: " << ::WSAGetLastError() << "\n";
::WSACleanup();
system("pause");
exit(1);
}
cout << "Server socket created successfully...\n";
//
ret_val = ::bind(sock_svr, (SOCKADDR*)&addr_svr, addr_len);
if (ret_val != 0)
{
cerr << "Failed to bind server socket!Error code: " << ::WSAGetLastError() << "\n";
&
{
cout << "Initializing server...\n";
//
winsock_ver = MAKEWORD(2, 2);
addr_len = sizeof(SOCKADDR_IN);
addr_svr.sin_family = AF_INET;
addr_svr.sin_port = ::htons(SERVER_PORT);
addr_svr.sin_addr.S_un.S_addr = ADDR_ANY;
memset(buf_ip, 0, IP_BUF_SIZE);
//
ret_val = ::WSAStartup(winsock_ver, &wsa_data);
if (ret_val != 0)
{
cerr << "WSA failed to start up!Error code: " << ::WSAGetLastError() << "\n";
system("pause");
exit(1);
}
cout << "WSA started up successfully...\n";
//
sock_svr = ::socket(AF_INET, SOCK_STREAM, 0);
if (sock_svr == INVALID_SOCKET)
{
cerr << "Failed to create server socket!Error code: " << ::WSAGetLastError() << "\n";
::WSACleanup();
system("pause");
exit(1);
}
cout << "Server socket created successfully...\n";
//
ret_val = ::bind(sock_svr, (SOCKADDR*)&addr_svr, addr_len);
if (ret_val != 0)
{
cerr << "Failed to bind server socket!Error code: " << ::WSAGetLastError() << "\n";
&