Changeset 11 in Main for trunk/Server/server.c


Ignore:
Timestamp:
Sep 13, 2024, 9:47:34 PM (2 months ago)
Author:
Nishi
Message:

multi-client

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Server/server.c

    r10 r11  
    77#include <unistd.h>
    88#include <string.h>
     9#include <stdbool.h>
    910
    1011#include <cm_log.h>
     
    1213#ifdef __MINGW32__
    1314#include <winsock2.h>
     15#include <process.h>
    1416#define NO_IPV6
    1517#else
     
    110112}
    111113
    112 void tw_server_loop(void){
     114#ifdef __MINGW32__
     115struct pass_entry {
     116        int sock;
     117        bool ssl;
     118};
     119
     120unsigned int WINAPI tw_server_pass(void* ptr) {
     121        int sock = ((struct pass_entry*)ptr)->sock;
     122        bool ssl = ((struct pass_entry*)ptr)->ssl;
     123#else
     124void tw_server_pass(int sock, bool ssl) {
     125#endif
     126        close_socket(sock);
     127#ifdef __MINGW32__
     128        _endthreadex(0);
     129#endif
     130}
     131
     132void tw_server_loop(void) {
    113133        struct timeval tv;
    114         while(1){
     134        while(1) {
    115135                FD_ZERO(&fdset);
    116136                int i;
    117                 for(i = 0; i < sockcount; i++){
     137                for(i = 0; i < sockcount; i++) {
    118138                        FD_SET(sockets[i], &fdset);
    119139                }
     
    121141                tv.tv_usec = 0;
    122142                int ret = select(FD_SETSIZE, &fdset, NULL, NULL, &tv);
    123                 if(ret == -1){
     143                if(ret == -1) {
    124144                        break;
    125                 }else if(ret > 0){
     145                } else if(ret > 0) {
    126146                        /* connection */
    127147                        int i;
    128                         for(i = 0; i < sockcount; i++){
    129                                 if(FD_ISSET(sockets[i], &fdset)){
     148                        for(i = 0; i < sockcount; i++) {
     149                                if(FD_ISSET(sockets[i], &fdset)) {
    130150                                        SOCKADDR claddr;
    131151                                        int clen = sizeof(claddr);
    132152                                        int sock = accept(sockets[i], (struct sockaddr*)&claddr, &clen);
    133                                         close_socket(sock);
     153#ifdef __MINGW32__
     154                                        HANDLE thread;
     155                                        struct pass_entry* e = malloc(sizeof(*e));
     156                                        e->sock = sock;
     157                                        e->ssl = config.ports[i] & (1ULL << 32);
     158                                        thread = (HANDLE)_beginthreadex(NULL, 0, tw_server_pass, e, 0, NULL);
     159#else
     160                                        pid_t pid = fork();
     161                                        if(pid == 0) {
     162                                                tw_server_pass(sock, config.ports[i] & (1ULL << 32));
     163                                                _exit(0);
     164                                        } else {
     165                                                close_socket(sock);
     166                                        }
     167#endif
    134168                                }
    135169                        }
Note: See TracChangeset for help on using the changeset viewer.