Разработайте один проект в решении из командной строки

Несколько указателей:

необходимо обработать возвращаемое значение 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 '->'';) так, чтобы Вы только посмотрели на каждый входящий символ однажды.

И серьезно, необходимо рассмотреть нахождение, что библиотека делает все это для Вас. Это не легкое получение его право.

5
задан Dave 28 August 2009 в 07:19
поделиться

2 ответа

Используйте 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
8
ответ дан 14 December 2019 в 01:12
поделиться

Взгляните на эту страницу , я думаю, это то, что вы ищете. Не забудьте параметр / Project, если вы хотите построить только один проект.

1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: