[FIXED] Threadsicherer Split ip:port in c

Ausgabe

Ich habe einen Text, der eine Liste von ip:port enthält, und ich habe ein Multithreading-Programm, das sie separat in IP und Port aufteilt. Ich habe strtok verwendet, aber es gibt viele Fehler und Probleme und das Programm bekommt jedes Mal einen Segmentierungsfehler + es muss make to strdup char pointer machen, was sehr ärgerlich ist. Ich habe strchr verwendet, aber es gibt mir nur den Port, kann ihn aber nicht zum Extrahieren der IP verwenden. Das Ziel ist, IP als Zeichenfolge und den Port als Ganzzahl zu extrahieren, und die Segmentierung wird nie fehlgeschlagen

Beispiel:

Dies ist die Startfunktion des Threads

void* startthread() {
    do {
        char* proxy = "127.0.0.1:443";

        char* buffered = strdup(proxy);

        char* host = strtok(buffered,":");
        int port = atoi(strtok(NULL,":"));

        printf("%s:%d",host,port);
    }while(1);
}

gdb

Thread 8 "main" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4a34700 (LWP 47410)]
__GI_____strtol_l_internal (nptr=0x0, endptr=endptr@entry=0x0,

Lösung

Eine ziemlich einfache Möglichkeit, dies zu handhaben (die gemäß Ihren Tags sowohl mit C als auch mit C++ kompatibel ist), wäre die Verwendung von sscanf:

char host[256];
int port;

sscanf(proxy, "%255[^:]:%d", host, &port);

Aber ja, strtokund Multithreading ist eine miese Kombination. Dann wieder, strtokund fast alles ist eine miese Kombination.

Ich nehme an, um vollständig zu sein, muss ich darauf hinweisen, dass das [^:]Scanformat vom implementierungsdefinierten Verhalten abhängt. Theoretisch darf eine Implementierung dies wörtlich behandeln – als Bedeutung entweder ^oder :, anstatt “alles außer einem Doppelpunkt” – aber ich kenne nur eine Implementierung (Borlands Compiler für MS-DOS), die dies getan hat, und es ist längst überholt.


Beantwortet von –
Jerry Coffin


Antwort geprüft von –
Gilberto Lyons (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like