1- #include < EasyCrossPlatform.h>
1+ #include < EasyCrossPlatform.h>
22#include < iostream>
33using namespace EasyCrossPlatform ::Network::Socket;
44std::vector<TCPAsyncClientSocket*> myClients;
55std::mutex myMutex;
6- class MyServerFunction {
7- public:
8- static void onServerNewConn (void * newClientSocket, void * ServerClassPtr) {
9- TCPAsyncClientSocket* MyClientSocket = (TCPAsyncClientSocket*) newClientSocket;
10- TCPAsyncServerSocket* MyServer = (TCPAsyncServerSocket*)ServerClassPtr;
11- myClients.push_back (MyClientSocket);
12- }
13- static void onServerError (int errCode, const std::string& errInfo, void * ServerClassPtr) {
14- TCPAsyncServerSocket* MyServer = (TCPAsyncServerSocket*)ServerClassPtr;
15- // std::cout << "SrvError:" << errInfo << std::endl;
16- }
17- static void onClientConnect (bool Succeed, void * ClientPtr){
18- TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
19-
20- // std::cout << "ClientConnect:" << MyClient->getRemoteAddr().getIPString() << ":" << MyClient->getRemoteAddr().getPort() << std::endl;
21- }
22- static void onClientDisconnect (void * ClientPtr) {
23- TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
24- // std::cout << "ClientDisconnect:" << std::endl;
25-
26- MyClient->Destroy ();
27-
28- myMutex.lock ();
29- bool ClientsEmpty = myClients.empty ();
30-
6+ class MyServerFunction {
7+ public:
8+ static void onServerNewConn (void * newClientSocket, void * ServerClassPtr) {
9+ TCPAsyncClientSocket* MyClientSocket = (TCPAsyncClientSocket*)newClientSocket;
10+ TCPAsyncServerSocket* MyServer = (TCPAsyncServerSocket*)ServerClassPtr;
11+ myClients.push_back (MyClientSocket);
12+ }
13+ static void onServerError (int errCode, const std::string& errInfo, void * ServerClassPtr) {
14+ TCPAsyncServerSocket* MyServer = (TCPAsyncServerSocket*)ServerClassPtr;
15+ std::cout << " SrvError:" << errInfo << std::endl;
16+ }
17+ static void onClientConnect (bool Succeed, void * ClientPtr) {
18+ TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
19+ // std::cout << "ClientConnect:" << MyClient->getRemoteAddr().getIPString() << ":" << MyClient->getRemoteAddr().getPort() << std::endl;
20+ }
21+ static void onClientDisconnect (void * ClientPtr) {
22+ TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
23+ MyClient->Destroy ();
24+
25+ myMutex.lock ();
26+ bool ClientsEmpty = myClients.empty ();
3127
32- if (!ClientsEmpty) {
33- for ( auto i = myClients. begin (); i != myClients. end (); i++ ) {
34- if ((*i) == MyClient ) {
35- delete MyClient;
36- i = myClients. erase (i) ;
37- break ;
38- }
28+
29+ if (!ClientsEmpty ) {
30+ for ( auto i = myClients. begin (); i != myClients. end (); i++ ) {
31+ if ((*i) == MyClient) {
32+ delete MyClient ;
33+ i = myClients. erase (i) ;
34+ break ;
3935 }
4036 }
41- myMutex.unlock ();
42- }
43- static void onClientMsg (const std::string& data, void * ClientPtr) {
44- TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
45- // std::cout << MyClient->getRemoteAddr().getIPString() << ":(" << data << ")" << std::endl;
46- MyClient->SendMsg (data);
47- }
48- static void onClientError (int errCode, const std::string& errInfo, void * ClientPtr) {
49- TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
50- // std::cout << "ClientError:" << errInfo << std::endl;
5137 }
38+ myMutex.unlock ();
39+ }
40+ static void onClientMsg (const std::string& data, void * ClientPtr) {
41+ TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
42+ // std::cout << MyClient->getRemoteAddr().getIPString() << ":(" << data << ")" << std::endl;
43+ MyClient->SendMsg (data);
44+ }
45+ static void onClientError (int errCode, const std::string& errInfo, void * ClientPtr) {
46+ TCPAsyncClientSocket* MyClient = (TCPAsyncClientSocket*)ClientPtr;
47+ // std::cout << "ClientError:" << errInfo << std::endl;
48+ }
5249};
5350int main (int argc, char ** args) {
5451 std::cout << " hi" << std::endl;
55- EasyCrossPlatform::Network::Socket::SocketWorker myListeningWorker;
56- EasyCrossPlatform::Network::Socket::SocketWorker myClientWorker1;
57- EasyCrossPlatform::Network::Socket::SocketWorker myClientWorker2;
58- std::deque<EasyCrossPlatform::Network::Socket::SocketWorker*> myWorkers;
59- myWorkers.push_back (&myClientWorker1);
60- myWorkers.push_back (&myClientWorker2);
52+ SocketWorker myListeningWorker;
6153
62- EasyCrossPlatform::Network::Socket::TCPAsyncServerSocket mSocket ;
63- mSocket .setWorkers (&myListeningWorker, myWorkers);
54+ TCPAsyncServerSocket mSocket ;
55+ // On Unix/Linux systems, libuv's server socket and the socket after connection established can be only served on one uv_loop_t handle.
56+ // We are now only accepting 1 SocketWorker for each Server Socket due to cross-platform concerns.
57+ mSocket .setWorkers (&myListeningWorker);
6458 mSocket .Init ();
6559 mSocket .ClientConnectCallBack = MyServerFunction::onClientConnect;
6660 mSocket .ClientDisconnectCallBack = MyServerFunction::onClientDisconnect;
@@ -69,9 +63,9 @@ int main(int argc, char** args) {
6963 mSocket .ServerErrorCallBack = MyServerFunction::onServerError;
7064 mSocket .ServerNewConnCallBack = MyServerFunction::onServerNewConn;
7165 // Binding 0.0.0.0 means binding every interface.
72- // Keep in mind that Linux users need to use root permission to bind the socket to 700. Otherwise you need to find a bigger number like 25535.
73- mSocket .Listen (EasyCrossPlatform::Network::Socket:: IpAddr (" 0.0.0.0" , 700 , true ),200 );
74-
66+ // Keep in mind that Linux users need to use root permission to bind the socket to 700. Otherwise you need to find a bigger number like 25535(Port range from 1-65535) .
67+ mSocket .Listen (IpAddr (" 0.0.0.0" , 25565 , true ), 200 );
68+
7569 std::cin.get ();
7670 std::cout << " ----" << std::endl;
7771 // If you want every computer in the LAN to recieve, type 255.255.255.255 for IP Address.
0 commit comments