1
Network / Socket stops receiving packets
« on: February 05, 2013, 05:01:42 pm »
I have been making my (M)MO project, but a problem has sopped me from progressing. When i use non-blocking UDP sockets for receiving data from players it works at first but after a while the server stops receiving data. I test both the server and the client same time on the same computer, so that could cause some problems.
This is smaller version of the server's code:
The client's code is somewhat smaller:
It's also interesting that if I change the sleeping time of the server to be smaller (like 0.0001 sec) the freezing happens more often.
I haven't been able to solve this problem myself and this caused me to quit my project for almost half a year.
Any help would be greatly appreciated.
This is smaller version of the server's code:
Uint16 unused_port = 1026;
struct client
{
SocketUDP In;
IPAddress ClientIP;
client(IPAddress IP)
{
In.Bind(unused_port);
unused_port++;
In.SetBlocking(false);
ClientIP=IP;
}
};
int main()
{
vector<client> clients;
SocketTCP Connector;
Connector.SetBlocking(false);
Connector.Listen(1025);
unsigned short port;
Packet p;
IPAddress IP("127.0.0.1");
for(;;)
{
//check for new connections
IPAddress IncomingIP;
SocketTCP NewClient;
if(Connector.Accept(NewClient, &IncomingIP) == Socket::Done)
{
Packet clients_port;
clients_port<<unused_port;
NewClient.Send(clients_port);
clients.push_back(client(IncomingIP));
NewClient.Close();
}
//go trough clients
for(vector<client>::iterator i=clients.begin(); i!=clients.end(); i++)
{
//get all packets
while(i->In.Receive(p,i->ClientIP, port)==Socket::Done)
{
int a;
p>>a;
cout << a << endl;
p.Clear();
}
Sleep(0.001f);
}
}
return 0;
}
But with this code the server stops receiving data only if i have once closed and restarted the client program.struct client
{
SocketUDP In;
IPAddress ClientIP;
client(IPAddress IP)
{
In.Bind(unused_port);
unused_port++;
In.SetBlocking(false);
ClientIP=IP;
}
};
int main()
{
vector<client> clients;
SocketTCP Connector;
Connector.SetBlocking(false);
Connector.Listen(1025);
unsigned short port;
Packet p;
IPAddress IP("127.0.0.1");
for(;;)
{
//check for new connections
IPAddress IncomingIP;
SocketTCP NewClient;
if(Connector.Accept(NewClient, &IncomingIP) == Socket::Done)
{
Packet clients_port;
clients_port<<unused_port;
NewClient.Send(clients_port);
clients.push_back(client(IncomingIP));
NewClient.Close();
}
//go trough clients
for(vector<client>::iterator i=clients.begin(); i!=clients.end(); i++)
{
//get all packets
while(i->In.Receive(p,i->ClientIP, port)==Socket::Done)
{
int a;
p>>a;
cout << a << endl;
p.Clear();
}
Sleep(0.001f);
}
}
return 0;
}
The client's code is somewhat smaller:
int main()
{
int a=0;
SocketUDP Out;
SocketTCP Connector;
Connector.Connect(1025,"127.0.0.1");
Connector.SetBlocking(true);
Int16 port;
Packet p;
Connector.Receive(p);
p>>port;
cout << port << endl;
p.Clear();
IPAddress IP("127.0.0.1");
for(;;)
{
a++;
cout << a << endl;
p<<a;
Out.Send(p,IP,port);
Sleep(0.1f);
p.Clear();
}
return 0;
}
{
int a=0;
SocketUDP Out;
SocketTCP Connector;
Connector.Connect(1025,"127.0.0.1");
Connector.SetBlocking(true);
Int16 port;
Packet p;
Connector.Receive(p);
p>>port;
cout << port << endl;
p.Clear();
IPAddress IP("127.0.0.1");
for(;;)
{
a++;
cout << a << endl;
p<<a;
Out.Send(p,IP,port);
Sleep(0.1f);
p.Clear();
}
return 0;
}
It's also interesting that if I change the sleeping time of the server to be smaller (like 0.0001 sec) the freezing happens more often.
I haven't been able to solve this problem myself and this caused me to quit my project for almost half a year.
Any help would be greatly appreciated.