0 Pluspunkte 0 Minuspunkte

Ich habe diesen Code für einen TCP Server in C.

#include <stdio.h>
#include <winsock.h>

/* Puffer für eingehende Nachrichten */
#define RCVBUFSIZE 1024

int main( int argc, char *argv[]) {

    struct sockaddr_in server, client;
    SOCKET sock, fd;    
    unsigned int len;

    /* Initialisiere WSAData */
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD (1, 1);
    WSAStartup(wVersionRequested, &wsaData);

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    memset( &server, 0, sizeof (server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(1234);

    bind(sock,(struct sockaddr*)&server, sizeof(server));

    listen(sock, 5);

    /* endlosschleife (blocking) */
    for (;;) {
        
        len = sizeof(client);
        fd = accept(sock, (struct sockaddr*)&client, &len);
        if (fd < 0)
            continue;
        
        printf("Bearbeite den Client mit der Adresse: %s\n", inet_ntoa(client.sin_addr));

        char echo_buffer[RCVBUFSIZE];
        
        int recv_size = recv(fd, echo_buffer, RCVBUFSIZE,0);
            
        echo_buffer[recv_size] = '\0';

        printf("Nachrichten vom Client : %s", echo_buffer);
        
        send(fd, echo_buffer, recv_size,0);

        closesocket(fd);

    }
    
    return 0;
    
}

Wie kann ich das Programm so umschreiben das für jeden Client ein eigener Thread erstellt wird und sich somit mehrere Clients gleichzeitig verbinden können?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Zuerst erstellst du eine Funktion, die deinen Thread darstellt.

void handleClient(void* clientSocket) {
    SOCKET fd = *((SOCKET*)clientSocket);

    char echo_buffer[RCVBUFSIZE];

    int recv_size = recv(fd, echo_buffer, RCVBUFSIZE, 0);

    echo_buffer[recv_size] = '\0';

    printf("Nachrichten vom Client: %s", echo_buffer);

    send(fd, echo_buffer, recv_size, 0);

    closesocket(fd);

    // Beenden Sie den Thread
    _endthread();
}

Und wenn sich ein neuer Client verbindet erstellst du einen neuen Thread der den Client behandelt.

_beginthread(handleClient, 0, (void*)&fd);

Hier ist das ganze Programm.

#include <stdio.h>
#include <winsock.h>

#include <process.h>

/* Puffer für eingehende Nachrichten */
#define RCVBUFSIZE 1024

void handleClient(void* clientSocket) {
    SOCKET fd = *((SOCKET*)clientSocket);

    char echo_buffer[RCVBUFSIZE];

    int recv_size = recv(fd, echo_buffer, RCVBUFSIZE, 0);

    echo_buffer[recv_size] = '\0';

    printf("Nachrichten vom Client: %s", echo_buffer);

    send(fd, echo_buffer, recv_size, 0);

    closesocket(fd);

    // Beenden Sie den Thread
    _endthread();
}

int main( int argc, char *argv[]) {

    struct sockaddr_in server, client;
    SOCKET sock, fd;    
    unsigned int len;

    /* Initialisiere WSAData */
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD (1, 1);
    WSAStartup(wVersionRequested, &wsaData);

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    memset( &server, 0, sizeof (server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(1234);

    bind(sock,(struct sockaddr*)&server, sizeof(server));

    listen(sock, 5);

    /* endlosschleife (blocking) */
    for (;;) {
        
        len = sizeof(client);
        fd = accept(sock, (struct sockaddr*)&client, &len);
        if (fd < 0)
            continue;
        
        printf("Bearbeite den Client mit der Adresse: %s\n", inet_ntoa(client.sin_addr));

        _beginthread(handleClient, 0, (void*)&fd);

    }
    
    return 0;
    
}

von (716 Punkte)