diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-06-21 03:35:13 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-06-21 03:35:13 -0300 |
| commit | efeb10adcc606ad261782a260c8ef86e77ea0608 (patch) | |
| tree | da4da91139624a5b3b9952a1d931282a2bc50163 /src/communication.cc | |
| parent | 7dff6dfd600e346c7bbd9fbcf6064caae156c984 (diff) | |
| download | game-efeb10adcc606ad261782a260c8ef86e77ea0608.tar.gz game-efeb10adcc606ad261782a260c8ef86e77ea0608.zip | |
`connections.cc`
Diffstat (limited to 'src/communication.cc')
| -rw-r--r-- | src/communication.cc | 98 |
1 files changed, 59 insertions, 39 deletions
diff --git a/src/communication.cc b/src/communication.cc index b959bb1..71a05d3 100644 --- a/src/communication.cc +++ b/src/communication.cc @@ -1366,7 +1366,18 @@ int HandleConnection(void *Data){ AttachCommunicationThreadStack(StackNumber); } - CommunicationThread(Socket); + try{ + CommunicationThread(Socket); + }catch(RESULT r){ + error("HandleConnection: Nicht abgefangene Exception %d.\n", r); + }catch(const char *str){ + error("HandleConnection: Nicht abgefangene Exception \"%s\".\n", str); + }catch(const std::exception &e){ + error("HandleConnection: Nicht abgefangene Exception %s.\n", e.what()); + }catch(...){ + error("HandleConnection: Nicht abgefangene Exception unbekannten Typs.\n"); + } + DecrementActiveConnections(); if(UseOwnStacks){ @@ -1390,13 +1401,13 @@ bool OpenSocket(void){ struct linger linger = {}; linger.l_onoff = 0; linger.l_linger = 0; - if(setsockopt(TCPSocket, SOL_SOCKET, SO_LINGER, &linger, sizeof(struct linger)) == -1){ + if(setsockopt(TCPSocket, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)) == -1){ error("LaunchServer: Socket wurde nicht auf LINGER=0 gesetzt.\n"); return false; } int reuseaddr = 1; - if(setsockopt(TCPSocket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(int)) == -1){ + if(setsockopt(TCPSocket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)) == -1){ error("LaunchServer: Fehler %d bei setsockopt.\n", errno); return false; } @@ -1405,10 +1416,10 @@ bool OpenSocket(void){ ServerAddress.sin_family = AF_INET; ServerAddress.sin_port = htons(GamePort); ServerAddress.sin_addr.s_addr = inet_addr(GameAddress); - if(bind(TCPSocket, (struct sockaddr*)&ServerAddress, sizeof(struct sockaddr_in)) == -1){ + if(bind(TCPSocket, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress)) == -1){ error("LaunchServer: Fehler %d bei bind.\n", errno); print(1, "Bind Error Again -> Begin FloodBind :(\n"); - while(bind(TCPSocket, (struct sockaddr*)&ServerAddress, sizeof(struct sockaddr_in)) == -1){ + while(bind(TCPSocket, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress)) == -1){ DelayThread(1, 0); } } @@ -1433,48 +1444,57 @@ int AcceptorThreadLoop(void *Unused){ continue; } - if(UseOwnStacks){ - int StackNumber; - void *Stack; - GetCommunicationThreadStack(&StackNumber, &Stack); - if(Stack == NULL){ - print(3,"Kein Stack-Bereich mehr frei.\n"); - if(close(Socket) == -1){ - error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (1).\n", errno); - } - }else{ - IncrementActiveConnections(); - void *Argument = (void*)(((uintptr)Socket & 0xFFFF) - | (((uintptr)StackNumber & 0xFFFF) << 16)); - ThreadHandle ConnectionThread = StartThread(HandleConnection, - Argument, Stack, COMMUNICATION_THREAD_STACK_SIZE, true); - if(ConnectionThread == INVALID_THREAD_HANDLE){ - DecrementActiveConnections(); - ReleaseCommunicationThreadStack(StackNumber); + // TODO(fusion): I don't think anything in here can throw any exception. + try{ + if(UseOwnStacks){ + int StackNumber; + void *Stack; + GetCommunicationThreadStack(&StackNumber, &Stack); + if(Stack == NULL){ + print(3,"Kein Stack-Bereich mehr frei.\n"); if(close(Socket) == -1){ - error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (2).\n", errno); + error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (1).\n", errno); + } + }else{ + IncrementActiveConnections(); + void *Argument = (void*)(((uintptr)Socket & 0xFFFF) + | (((uintptr)StackNumber & 0xFFFF) << 16)); + ThreadHandle ConnectionThread = StartThread(HandleConnection, + Argument, Stack, COMMUNICATION_THREAD_STACK_SIZE, true); + if(ConnectionThread == INVALID_THREAD_HANDLE){ + DecrementActiveConnections(); + ReleaseCommunicationThreadStack(StackNumber); + if(close(Socket) == -1){ + error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (2).\n", errno); + } } - } - } - }else{ - if(ActiveConnections >= MAX_COMMUNICATION_THREADS){ - print(3,"Keine Verbindung mehr frei.\n"); - if(close(Socket) == -1){ - error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (3).\n", errno); } }else{ - IncrementActiveConnections(); - void *Argument = (void*)((uintptr)Socket & 0xFFFF); - ThreadHandle ConnectionThread = StartThread(HandleConnection, - Argument, COMMUNICATION_THREAD_STACK_SIZE, true); - if(ConnectionThread == INVALID_THREAD_HANDLE){ - print(3, "Kann neuen Thread nicht anlegen.\n"); - DecrementActiveConnections(); + if(ActiveConnections >= MAX_COMMUNICATION_THREADS){ + print(3,"Keine Verbindung mehr frei.\n"); if(close(Socket) == -1){ - error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (4).\n", errno); + error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (3).\n", errno); + } + }else{ + IncrementActiveConnections(); + void *Argument = (void*)((uintptr)Socket & 0xFFFF); + ThreadHandle ConnectionThread = StartThread(HandleConnection, + Argument, COMMUNICATION_THREAD_STACK_SIZE, true); + if(ConnectionThread == INVALID_THREAD_HANDLE){ + print(3, "Kann neuen Thread nicht anlegen.\n"); + DecrementActiveConnections(); + if(close(Socket) == -1){ + error("AcceptorThreadLoop: Fehler %d beim Schließen der Socket (4).\n", errno); + } } } } + }catch(RESULT r){ + error("AcceptorThreadLoop: Nicht abgefangene Exception %d.\n", r); + }catch(const char *str){ + error("AcceptorThreadLoop: Nicht abgefangene Exception \"%s\".\n", str); + }catch(...){ + error("AcceptorThreadLoop: Nicht abgefangene Exception unbekannten Typs.\n"); } } |
