当telnet这个server端时,如果没发送任何数据则能完好登陆,但是只要发送一次,剩下的所有client就都被阻塞了,select函数只能接受这个SOCKET的数据了,其他的也登陆不进来了,请指点一二,折磨我一天了这东西/***************************************************************************************/class Select
{
protected:
fd_set  fdset;
std::list<SOCKET> sockfd_set;

protected:
bool is_set(const SOCKET &fd) { return FD_ISSET(fd, &fdset); }
public:
Select()
{
FD_ZERO(&fdset);
}
void add(const SOCKET &fd) 

FD_SET(fd, &fdset);
sockfd_set.push_back(fd);


}

void remove(const SOCKET &fd)  {
FD_ZERO(&fdset); 
sockfd_set.erase(find(sockfd_set.begin(), sockfd_set.end(), fd));
std::list<SOCKET>::iterator it = sockfd_set.begin();
for(it; it != sockfd_set.end(); it++)
FD_SET(*it, &fdset);
} void clear() { FD_ZERO(&fdset); sockfd_set.clear(); }

size_t size() const { return sockfd_set.size(); }

SOCKET start(const timeval *tmv = NULL)
{
int state = select(fdset.fd_count + 1, &fdset, 0, 0, tmv);

if(state == SOCKET_ERROR)
throw NetExcept::NEB();

std::list<SOCKET>::iterator it = sockfd_set.begin();
for(it; it != sockfd_set.end(); it++){
if(is_set(*it))
break;
}

if(it == sockfd_set.end())
throw;

return *it;
}

};/**************************************************************************************
这个是读数据函数
***************************************************************************************/std::string SocketBase::recvX(const SOCKET &fd, const size_t n, int flag)
{
std::vector<char> vc(n); int count = n;
int len = 0, idx = 0; while(count > 0){
len = recv(fd, &vc[idx], count, flag);

if(len == 0)
throw NetExcept::ConnExpt(fd, 0);

if(len == SOCKET_ERROR)
throw NetExcept::ConnExpt(fd, SOCKET_ERROR);

count -= len;
idx += len;
} return std::string(vc.begin(), vc.end());
}/***************************************************************************************这个是main.cpp****************************************************************************************/Select io_sel;
io_sel.add(server.getfd());
SOCKET temp;
list<SOCKET> ls_set;

typedef list<SOCKET>::iterator LSIT;
while(true){
cout << io_sel.size() << endl;
temp = io_sel.start();
cout << "after" << endl;

if(temp == server.getfd()){
temp = server.acceptX();
io_sel.add(temp);
ls_set.push_back(temp);
server.sendX(temp, "welcome\n");
}else{
try{
string str = server.recvX(temp, 1);

cout << str << endl;
LSIT it = ls_set.begin();

for(it; it != ls_set.end(); it++){
if(*it != temp){
server.sendX(*it, str);
}
}
}catch(NetExcept::CE &dt)
{
shutdown(dt.fd, SD_BOTH);
closesocket(dt.fd);
io_sel.remove(dt.fd);
ls_set.erase(find(ls_set.begin(), ls_set.end(), dt.fd));
}


} } return 0;
}