Original Post
Hey, after implenting sucessfully a Reliable UDP Port into my network lib. I wanted to implent a TCP one also. It's already pretty close to completition but on connect im stuck with an ECONNREFUSED on the client side. I don't really understand why. When is ECONNREFUSED produced? The client, as it's non blocking, basically calls this function until it creates a valid filedescriptor. The listener/server does this to accept I know im using some internal stuff liek SNetworkAddress and whatsoever but i think it should be understandable. thanks in advance, DrHalan
bool CTCPPort::connectLoop(PeerID id)
{
if(this->isIPv6())
{
sockaddr_in6 tmpAddr;
if(getSockAddress6(tmpAddr, peers[id]->address))
{
if( ::connect ( peers[id]->socketfd, (sockaddr*)&tmpAddr , sizeof(tmpAddr)) == 0)
{
peers[id]->connected = true;
this->getCallback()->onPeerConnect(id);
return true;
}
}
}
else
{
sockaddr_in tmpAddr;
if(getSockAddress(tmpAddr, peers[id]->address))
{
if( ::connect ( peers[id]->socketfd, (sockaddr*)&tmpAddr , sizeof(tmpAddr)) == 0)
{
peers[id]->connected = true;
this->getCallback()->onPeerConnect(id);
return true;
}
}
}
// We just have to call connect again and then it should be fine
if(errno == EINPROGRESS || errno == EWOULDBLOCK)
return true;
#ifdef WINDOWS
if(errno == WSAEWOULDBLOCK)
return true;
#endif
if(errno == ECONNREFUSED)
callback->onConnectionFailed(ECFR_Denied);
// print out the error
perror("connect");
delete peers[id];
peers[id] = 0;
peerCount--;
return false;
}
if(this->isListening())
{
while((::listen( listenfd, 5) == 0) && (peerCount < maxPeers))
{
for(u32 u = 0; (u < maxPeers); u++)
{
if(!peers)
{
s32 socketfd = -1;
if(this->isIPv6())
{
sockaddr_in6 tmpAddr;
socklen_t tmpSize;
socketfd = accept( listenfd, (sockaddr*)&tmpAddr, &tmpSize);
if(socketfd == -1)
{
if(errno != EWOULDBLOCK)
perror("accept");
}
else
{
SNetworkAddress addr;
getNetworkAddress6(tmpAddr, addr);
peers = new STCPPeer(addr, socketfd);
}
}
else
{
sockaddr_in tmpAddr;
socklen_t tmpSize;
socketfd = accept( listenfd, (sockaddr*)&tmpAddr, &tmpSize);
if(socketfd == -1)
{
if(errno != EWOULDBLOCK)
perror("accept");
}
else
{
SNetworkAddress addr;
getNetworkAddress(tmpAddr, addr);
peers = new STCPPeer(addr, socketfd);
}
}
if(socketfd >= 0)
{
peers->connected = true;
peerCount++;
}
break;
}
}
}
if(errno != EWOULDBLOCK && errno != ECONNREFUSED && errno != EINPROGRESS)
perror("listen");
}