сервер запросов / ответов с использованием select (). Не могу написать клиенту

Я получил весь этот код от гид beej поэтому все принимающие могут быть видны оттуда. В коде Биджа он получает сообщение от клиента, а затем отправляет сообщение всем другим клиентам. Это можно увидеть из этого фрагмента здесь:

                // handle data from a client
if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
// got error or connection closed by client
if (nbytes == 0) {
//handle error
}
}
else {
// we got some data from a client
for(j = 0; j <= fdmax; j++) {
// send to everyone!
if (FD_ISSET(j, &master)) {
// except the listener and ourselves
if (j != listener && j != i) {
if (send(j, buf, nbytes, 0) == -1) {
perror("send");
}
}
}
}
}
} // END handle data from client

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

вот что у меня так далеко:

long length = 0;
string stringRead;
messagebroker broker;
read( i, &length, sizeof( length ) );
length = ntohl( length );
if(length > -1)
while ( 0 < length ) {
char buffer[1024];
int cread;
cread = read( i, buffer, min( sizeof( buffer ), length ) );
stringRead.append( buffer, cread );
length -= cread;
}
cout << "Got Message: " + stringRead << endl;
string response = broker.handleMessage(stringRead.c_str());

cout << "sending response" << response << endl;

//socket ready for writing
if (FD_ISSET(i, &master)) { //should i check to see if write_fds? I have this here
//simply because the guide has it, but i am suspicious
//it is there so we can not write to the master.
length = htonl( response.length() );
cout << "sent length" << endl;
if(send( i, &length, sizeof(length) , 0) == 0){
fprintf(stderr, "Error sending data %d\n", errno);
exit(3);
}
if(send( i, response.data(), response.length(),0 )== 0){
fprintf(stderr, "Error sending data %d\n", errno);
exit(3);
}
}   //end if

Я получаю все данные от клиента на сервере. Тогда я не уверен, что проблема заключается в записи данных на сервер или чтении с клиента. Я предполагаю, что это пишет клиенту с сервера. Как я намекал в комментариях, я думаю, что знаю, где я ошибся, но я удалил это утверждение if, и я все еще не мог прочитать что-либо на стороне клиента. Нужно ли устанавливать флаг для записи в самом начале? Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще. Извините, этот пост был таким длинным.

2

Решение

Просто напиши. Если он возвращает -1 / EWOULDBLOCK или значение, указывающее, что он не записал полный ответ, затем Вы добавляете FD в writefds и продолжаете запись, когда FD становится доступным для записи. Обычно у вас нет writefds, так как FD обычно доступны для записи, то есть они обычно имеют место в своих буферах отправки сокетов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]