#pragma once
/*
test demo
#define IN_WINDOWS //需要定义,这个是设计在WINDOWS里使用的代码。
#include "baisck.hpp" //然后在加载hpp文件
//客户端
int mainCli()
{
WSADATA wsadata;
SOCKET sck;
bool btool = false;
btool = USEBAI_SCK::BAI_INIT(sck, wsadata);
btool = USEBAI_SCK::BAI_CONNECT(sck, "www.baidu.com", 443);
//USEBAI_SCK::BAI_SEND(...);
//USEBAI_SCK::BAI_RECV(...);
USEBAI_SCK::BAI_CLOSESOCKET(sck);
USEBAI_SCK::BAI_FREEWSADATA();
return 0;
}
//服务端
DWORD WINAPI CliServer(LPVOID lp)
{
BAISTRUCT *cli = (BAISTRUCT*)lp;
USEBAI_SCK::BAI_CLOSESOCKET(cli->sck);
cli->setNotUse();
return 0;
}
int mainServer()
{
SOCKET sck;
WSADATA wsadata;
bool btool;
btool = USEBAI_SCK::BAI_INIT(sck, wsadata);
btool = USEBAI_SCK::BAI_CREATESERVER(sck, 8081);
if (!btool) {
std::cout << "ERR CREATE SERVER";
return 0;
}
BAISTRUCT *pFirst, *pPoint;
pFirst = new BAISTRUCT;
pPoint = pFirst;
while (1)
{
pPoint = pPoint->getNext(pFirst);
btool = USEBAI_SCK::BAI_ACCEPT(sck, pPoint->addr, pPoint->sck);
CreateThread(0, 0, CliServer, (LPVOID)pPoint, 0, 0);
Sleep(100);
}
return 0;
}
*/
#include <Windows.h>
#include <winsock.h>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")
#ifdef IN_WINDOWS
struct BAISTRUCT
{
SOCKET sck;
SOCKADDR_IN addr;
BAISTRUCT *next;
BAISTRUCT()
{
sck = -1;
next = 0;
}
void setNotUse()
{
this->sck = -1;
}
BAISTRUCT* getNext(BAISTRUCT*first)
{
BAISTRUCT * p = first;
if (p == 0) { return 0; }
while (1)
{
if (p->sck == -1)
{
return p;
}
else if (p->next == 0)
{
p->next = new BAISTRUCT;
return p->next;
}
p = p->next;
}
}
void free(BAISTRUCT*first)
{
BAISTRUCT *point = first, *n;
while (1)
{
if (point->next != 0)
{
n = point->next;
delete point;
point = n;
}
else
{
delete point;
return;
}
}
}
int getCount(BAISTRUCT*first)
{
BAISTRUCT *point = first;
int countnum = 0;
while (1)
{
if (point->next != 0)
{
countnum++;
point = point->next;
}
else
{
countnum++;
break;
}
}
return countnum;
}
};
namespace USEBAI_SCK
{
bool BAI_INIT(SOCKET &sck, WSADATA &wsadata)
{
WSAStartup(0x101, &wsadata);
sck = socket(AF_INET, SOCK_STREAM, 0);
if (sck < 0) {
return false;
}
return true;
}
bool BAI_CREATESERVER(SOCKET &sck, int port)
{
int ret;
SOCKADDR_IN addr = {0};
addr.sin_addr.S_un.S_addr = 0;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
ret= bind(sck, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if (ret < 0) {
return false;
}
listen(sck, 1);
return true;
}
bool BAI_CONNECT(SOCKET &sck, const char *hostname, int port)
{
int ret;
SOCKADDR_IN addr;
struct hostent * host;
in_addr inaddr;
host = gethostbyname(hostname);
inaddr = *(in_addr*)host->h_addr_list[0];
//std::cout << inet_ntoa(inaddr) << std::endl;
addr.sin_addr.S_un.S_addr = inaddr.S_un.S_addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
ret = connect(sck, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if (ret < 0) {
return false;
}
return true;
}
int BAI_SEND(SOCKET &sck, char *buff, int buflen)
{
return send(sck, buff, buflen, 0);
}
int BAI_RECV(SOCKET &sck, char *buff, int buflen)
{
return recv(sck, buff, buflen, 0);
}
bool BAI_ACCEPT(SOCKET &sck, SOCKADDR_IN &cliaddr, SOCKET &clisck)
{
int addrlen = sizeof(SOCKADDR);
clisck = accept(sck, (SOCKADDR*)&cliaddr, &addrlen);
if (clisck < 0) {
return false;
}
return true;
}
void BAI_CLOSESOCKET(SOCKET &sck)
{
closesocket(sck);
}
void BAI_FREEWSADATA()
{
WSACleanup();
}
};
#endif
自制WINDOWS SOCKET命名空间学习
于 2024-07-26 09:21:21 首次发布