Non-Blocking Update Crash Fix

This commit is contained in:
Adam Lowman
2004-07-14 06:38:11 +00:00
parent 5217d21a98
commit c2f3a60ebb
+30 -28
View File
@@ -78,11 +78,11 @@ bool EzSockets::bind(unsigned short port) {
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
return(::bind(sock,(struct sockaddr*)&addr, sizeof(addr))>0);
return(::bind(sock,(struct sockaddr*)&addr, sizeof(addr))==0);
}
bool EzSockets::listen() {
if(::listen(sock,MAXCON)<=0)
if(::listen(sock,MAXCON)!=0)
return false;
state = skLISTENING;
@@ -138,14 +138,12 @@ bool EzSockets::connect(const std::string& host,unsigned short port) {
#elif defined(_WINDOWS)
struct hostent* phe;
phe = gethostbyname(host.c_str());
addr.sin_family = AF_INET;
addr.sin_addr = *((LPIN_ADDR)* phe->h_addr_list);
addr.sin_port = htons(port);
addr.sin_addr = *((LPIN_ADDR)* phe->h_addr_list);
#else
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET,host.c_str(),&addr.sin_addr);
#endif
#endif
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if(::connect(sock,(struct sockaddr*)&addr,sizeof(addr))!=0)
return false;
@@ -162,13 +160,17 @@ bool EzSockets::CanRead() {
}
bool EzSockets::IsError() {
if(state == skERROR)
if(state==skERROR)
return true;
FD_ZERO(scks);
FD_SET((unsigned)sock,scks);
return(select(sock+1,NULL,NULL,scks,times)<=0);
if(select(sock+1, NULL, NULL, scks, times)>=0)
return false;
state=skERROR;
return true;
}
bool EzSockets::CanWrite() {
@@ -179,20 +181,15 @@ bool EzSockets::CanWrite() {
}
void EzSockets::update() {
if(state == skERROR) //If socket is in error, don't bother.
if(IsError()) //If socket is in error, don't bother.
return;
if(IsError()) {
state=skERROR;
return;
}
while(CanRead() && !IsError()) //Check for Reading
if(pUpdateRead()<1)
break;
if (CanWrite() && (outBuffer.length()>0))
pUpdateWrite();
if(CanWrite() && (outBuffer.length()>0))
pUpdateWrite();
}
@@ -263,28 +260,33 @@ int EzSockets::PeekPack(char* data,unsigned int max) {
pUpdateRead();
if(blocking) {
while((inBuffer.length()<4)&& !IsError())
while((inBuffer.length()<4) && !IsError()) {
pUpdateRead();
}
if(IsError())
return -1;
}
if(inBuffer.length()<4)
return -1;
unsigned int size=0;
PeekData((char*)&size,4);
size=ntohl(size);
if(blocking)
while ((inBuffer.length()<(size+4)) && !IsError())
pUpdateRead();
else if(inBuffer.length()>3)
if((inBuffer.length()<(size+4)) || (inBuffer.length()<=4))
return -1;
while ((inBuffer.length()<(size+4)) && !IsError())
pUpdateRead();
else
if((inBuffer.length()<(size+4)) || (inBuffer.length()<=4))
return -1;
string tBuff(inBuffer.substr(4,size));
if(tBuff.length()>max)
tBuff.substr(0,max);
memcpy (data,tBuff.c_str(),tBuff.length());
return size;
}
@@ -349,7 +351,7 @@ int EzSockets::pUpdateRead() {
if(bytes>0)
inBuffer.append(tempData,bytes);
else
else if(bytes<0)
state = skERROR;
return bytes;
}
@@ -359,7 +361,7 @@ int EzSockets::pUpdateWrite() {
if (bytes>0)
outBuffer = outBuffer.substr(bytes);
else
else if(bytes<0)
state = skERROR;
return bytes;
}