zeek/auxil/libunistd/portable/ipc/BsdSocketServer.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

82 lines
1.8 KiB
C++

// BsdSocketServer.cpp
// Created by Robin Rowe on 11/27/2015
// Copyright (c) 2015 Robin.Rowe@CinePaint.org
// License open source MIT
#include "BsdSocketServer.h"
namespace portable
{
SOCKET BsdSocketServer::ListenAccept()
{ const int backlog = 1; //point-to-point, not SOMAXCONN;
listen(socketfd,backlog);
sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
#ifdef _DEBUG
puts("\nAccepting connections...");
#endif
SOCKET newsockfd = accept(socketfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0)
{ perror("ERROR on accept");
}
#ifdef _DEBUG
else
{ puts("connected");
}
#endif
return newsockfd;
}
void BsdSocketServer::ListenRun()
{ while(isGo)
{ if(socketfd>0)
{ SOCKET sock = ListenAccept();
if(!pool.SetSlot(sock))
{ puts("WARN: no socket slots");
continue;
}
if(!Login(sock))
{ puts("ERROR: socket connect failed");
pool.ReleaseSlot(sock);
continue;
}
OnConnect(sock);
}
}
OnStop();
}
void BsdSocketServer::PacketRun()
{ std::unique_ptr<char[]> buffer(new char[bufsize]);
PacketReader packet(buffer.get(),bufsize);
unsigned offset=0;
while(isGo)
{ const int bytes = RecvFrom(buffer.get(),bufsize,offset);
packet.Reset();
offset=OnPacket(bytes,packet);
}
OnStop();
}
bool BsdSocketServer::Open(int serverPort,int maxStreams,bool isPacketRun)
{ this->isPacketRun=isPacketRun;
pool.Reset(maxStreams);
socketfd=OpenSocket();
if(socketfd == -1)
{ puts(errorMsg.GetLastError());
return false;
}
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons((u_short) serverPort);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(::bind(socketfd, (struct sockaddr*)&server_sockaddr,sizeof(server_sockaddr)) == -1)
{ puts(errorMsg.GetLastError());
return false;
}
SetReuse(socketfd);
isGo=true;
return true;
}
}