#c #c 11 #tcp #client-server #tcpclient
#c #c 11 #tcp #клиент-сервер #tcpclient — клиент #tcpclient
Вопрос:
Ниже приведен отрывок из моего client.cpp файл:
//Variables previously declared
char buffer[1024];
char sendbuffer[100];
int sockfd, b;
//Opens specified file
FILE *fp = fopen(argv[3], "rb");
while( (b = fread(sendbuffer, 1, sizeof(sendbuffer), fp)) > 0 )
{
send(sockfd, sendbuffer, b, 0);
}
Я новичок в клиент-серверном программировании, и я далек от того, чтобы быть очень опытным в C .
Когда я использую приведенный выше код, он успешно отправляет inf, но, очевидно, он не собирается отправлять данные по 4 байта за раз.
Если бы я изменил строку, содержащую send(), как показано ниже, без внесения других необходимых изменений, я уверен, что это было бы неправильно.
send(sockfd, sendbuffer, 4, 0);
Отлаживать также сложно, потому что, когда я вношу изменения в код, мне приходится постоянно имитировать взаимодействие клиент-сервер, на настройку которого требуется время.
Какой был бы наиболее эффективный способ отправить данные этого текстового файла по 4 байта за раз?
Кроме того, кто-нибудь может предложить инструмент или метод для быстрой отладки клиент-серверных программ?
Дайте мне знать, если потребуется дополнительная информация. Спасибо
Комментарии:
1. «Какой был бы наиболее эффективный способ отправлять данные этого текстового файла по 4 байта за раз» — я надеюсь, вы понимаете, насколько полярно противоположны эти два понятия. Отправка 4 байтов за раз является почти идеальной неэффективностью , особенно в том, что касается MTU вашего стека tcpip, который, вероятно, составляет не менее 1,5 тыс., Если не больше. В любом случае, возможно, отмена того, что вы уже сделали, и вместо этого изменение
char sendbuffer[100]
наchar sendbuffer[4]
сделало бы то, что вы, кажется, хотите.2. Я думаю, у вас неправильное представление о том, как должен работать TCP — это поток байтов, а не поток сообщений. Хотя вы можете вызывать
send
с 4 байтами за раз, ядро все равно может объединить несколько такихsend
в один пакет для повышения эффективности. И даже если этого избежать, отключив NAGLE, получатель все равно можетrecv
превышать 4 байта, которые вы отправляете за раз, или даже меньше. Если вы хотите иметь семантику сообщений в TCP, вам необходимо добавить соответствующий протокол приложения поверх потока байтов, а не с помощью несколькихsend
.3. Хорошо, эти комментарии прекрасно объяснили и ответили на мой вопрос. Спасибо
Ответ №1:
Ну, вы можете попробовать отправить 4 байта за раз, и это, вероятно, сработает, но вы не можете контролировать, сколько байтов на самом деле отправит потоковый сокет. Вы должны проверить возвращаемое значение. Я не думаю, что вам вообще нужно отлаживать программу. Ведение журнала лучше, потому что оно не приводит к временным задержкам, как это делает отладка, а время — деньги в сетевом мире.