При использовании send() для отправки данных из текстового файла с клиента на сервер через поток TCP, как мне отправить все данные, но только 4 байта за раз?

#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 байта за раз, и это, вероятно, сработает, но вы не можете контролировать, сколько байтов на самом деле отправит потоковый сокет. Вы должны проверить возвращаемое значение. Я не думаю, что вам вообще нужно отлаживать программу. Ведение журнала лучше, потому что оно не приводит к временным задержкам, как это делает отладка, а время — деньги в сетевом мире.