Несколько указателей:
необходимо обработать возвращаемое значение 0, который говорит Вам, что удаленный хост закрыл сокет.
Для неблокирования сокетов, также необходимо проверить ошибочное возвращаемое значение (-1) и удостовериться, что errno не является EINPROGRESS, который ожидается.
Вам определенно нужна лучшая обработка ошибок - Вы потенциально пропускаете буфер, на который указывает 'буфер'. Который, я заметил, Вы не выделяете нигде в этом фрагменте кода.
Кто-то еще сделал правильное замечание о том, как Ваш буфер не является завершенной струной до пустого указателя, если Ваше чтение () заполняет весь буфер. Это - действительно проблема и серьезная.
Ваш размер буфера является немного маленьким, но должен работать, пока Вы не пытаетесь считать больше чем 256 байтов, или независимо от того, что Вы выделяете для него.
, Если Вы волнуетесь по поводу вхождения в бесконечный цикл, когда удаленный хост отправляет Вам уродливое сообщение (потенциальная атака "отказ в обслуживании") тогда, необходимо использовать выбор () с тайм-аутом на сокете, чтобы проверить на удобочитаемость и только читать, если данные доступны, и прыгните с парашютом, если выбор () испытывает таймаут.
Что-то вроде этого могло бы работать на Вас:
fd_set read_set;
struct timeval timeout;
timeout.tv_sec = 60; // Time out after a minute
timeout.tv_usec = 0;
FD_ZERO(&read_set);
FD_SET(socketFileDescriptor, &read_set);
int r=select(socketFileDescriptor+1, &read_set, NULL, NULL, &timeout);
if( r<0 ) {
// Handle the error
}
if( r==0 ) {
// Timeout - handle that. You could try waiting again, close the socket...
}
if( r>0 ) {
// The socket is ready for reading - call read() on it.
}
В зависимости от объема данных Вы ожидаете получать, способ, которым Вы неоднократно сканируете все сообщение для "конца"; маркер очень неэффективен. Это лучше сделано с конечным автоматом (состояния, являющиеся 'e '->'n '->'d '->'';) так, чтобы Вы только посмотрели на каждый входящий символ однажды.
И серьезно, необходимо рассмотреть нахождение, что библиотека делает все это для Вас. Это не легкое получение его право.
Используйте DevEnv из командной строки:
DevEnv /Build Debug /Project ProjectName %SOLUTION_FILE%
где% SOLUTION_FILE% - это переменная среды, содержащая полный путь к файлу решения, а ProjectName - это имя проекта. Вывод пойдет на стандартный вывод.
Все решение можно перестроить с помощью:
DevEnv /Rebuild Debug %SOLUTION_FILE%
Пример; для проекта (установщика) с именем MSQuantSetup :
set SOLUTION_FILE=D:\dproj\MSQall\MSQuant\MSQuant.sln
DevEnv /Build Debug /Project MSQuantSetup %SOLUTION_FILE%
Или напрямую без переменной среды:
DevEnv /Build Debug /Project MSQuantSetup D:\dproj\MSQall\MSQuant\MSQuant.sln
Взгляните на эту страницу , я думаю, это то, что вы ищете. Не забудьте параметр / Project, если вы хотите построить только один проект.