当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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货