我从the beej guide获得了所有这些代码,因此可以从那里看到所有的接受。在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语句,我仍然无法在客户端读取任何内容。我是否需要在一开始就设置可写标志?如果您还有其他需要,请告诉我。对不起,这篇文章太长了。
答案 0 :(得分:1)
只需写下来。如果它返回-1 / EWOULDBLOCK,或者表示它没有写入完整响应的值,则然后将FD添加到writefds,并在FD变为可写时继续写入。您通常没有任何writefds,因为FD通常是可写的,也就是说它们通常在其套接字发送缓冲区中有空间。