Как я могу лучше прочитать мой сокет? - PullRequest
3 голосов
/ 07 февраля 2011

Это просто застревает каждый раз, когда я зацикливаюсь.Он сидит в ожидании чтения, но никогда ничего не читает, потому что, ну ... читать нечего.

Вот функция чтения:

int  readSocket(int sockfd, char* buffer) {

    FILE* file;
    file = fopen("logfile.txt","a+");

    char code[5];

    while(1) {

        int nBytes = read(sockfd, buffer, MY_BUFFER_SIZE);
        fprintf(file,"S->C: %s",buffer);

        strncpy(code, buffer,4); 
        code[4]='\0';



            if (nBytes == 0) break;

        memset(buffer, 0, MY_BUFFER_SIZE);

    }
    fclose(file);
    return codeParser(atoi(code));
}

Вот как это называется:

while (1) {
    serverCode = readSocket(sockfd, mybuffer);
    if (serverCode == 221) break;

    fflush (stdout);
    buffer = fgets (mybuffer, 1024, stdin); 

    writeSocket(sockfd, mybuffer);
}

Есть предложения?

1 Ответ

8 голосов
/ 07 февраля 2011

TCP-сокет является двунаправленным потоком. Он не знает о ваших границах сообщений. Вам нужен ваш собственный протокол поверх TCP для определения отдельных сообщений. Два Три общих подхода:

  • сообщений фиксированной длины,
  • длина сообщения, встроенного в заголовок сообщения фиксированной длины,
  • явный разделитель сообщений, скажем, новая строка, или \0x1 и т. Д. (Спасибо, @caf).

Редактировать 0:

Некоторые примечания о вашем коде:

  1. Всегда проверяйте возвращаемые значения системных вызовов, например read(2). Во-первых, это может быть -1, то есть ошибка, поэтому вам нужно проверить errno(3); во-вторых, вы можете прочитать менее 4 байтов, которые ожидаете.
  2. nBytes == 0 - это случай EOF, означающий, что другая сторона закрыла соединение.
  3. Вам не нужно memset() там.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...