Erreur 10053 sur un recv();
Bonjour !
Je ne comprend pas pourquoi mon programme ne peut pas lire sur un socket TCP, il me retourne l'erreur 10053.
nb: Mon pare-feu sous windows est desactivé!
Voici le "visuel" de l'interaction entre le client (a droite, et le serveur auquel il se connecte (a gauche)
http://img716.imageshack.us/img716/1...nstitrewve.png
Initialisation du serveur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
load_configuration();
welcome();
#if defined (WIN32)
WSADATA WSAData;
int error = WSAStartup(MAKEWORD(2,2), &WSAData);
#else
int error = 0;
#endif
int sock_err;
if(error)
{
cout << "ERROR: WSAStartup" << endl;
exit(0);
}
_server = socket(AF_INET, SOCK_STREAM, 0);
if(_server == INVALID_SOCKET)
{
cout << "ERROR: INVALID_SOCKET" << endl;
exit(0);
}
else {
cout << "Socket is ready (TCP)" << endl;
}
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(_config["port"].ival);
sock_err = bind(_server, (SOCKADDR*) &sin, sizeof(sin));
if(sock_err == SOCKET_ERROR)
{
cout << "ERROR: Binding socket" << endl;
exit(0);
}
sock_err = listen(_server, 5);
cout << "Socket is now listening on port " << _config["port"].ival << endl;
FD_ZERO(&recvfs);
pthread_create(&worker, NULL, Networker, this); |
Quand un client se connecte:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
int one = sizeof(sin);
while(true)
{
_incomingsocket = accept(_server, (struct sockaddr*)&sin, &one);
if(_incomingsocket == SOCKET_ERROR)
{
//SDL_Delay(50);
continue;
}
string ip = string();
ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b1));
ip += ".";
ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b2));
ip += ".";
ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b3));
ip += ".";
ip += lexical_cast<string>(static_cast<int>(sin.sin_addr.S_un.S_un_b.s_b4));
cout << "Client connected (IP: " << ip << "; sock: " << _incomingsocket << ")" << endl;
FD_SET(_incomingsocket, &recvfs);
register_session(create_session(ip, _incomingsocket));
if(_incomingsocket > _maxfd)
{
_maxfd = _incomingsocket;
}
} |
Le thread qui qui les socket:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
void* Networker(void* ptr)
{
ServerSocket* Master = reinterpret_cast<ServerSocket*>(ptr);
int socketactivity;
int sleep = 0, plength, i;
uint16_t header;
Packet packet;
struct timeval tv;
fd_set mask;
Buffer = new char;
int BytesReceived = 0;
cout << "Thread Networker is now up and running" << endl;
setup_callbacks();
cout << "Callbacks ready" << endl;
bool shutdown = false;
while(!shutdown)
{
if(select(Master->maxfd(), &Master->GetSocketSet(), NULL, NULL, NULL) < 0)
{
continue; // erreur ?
}
for(auto itr = Master->Clients().begin(); itr != Master->Clients().end(); ++itr)
{
if(!FD_ISSET(itr->second.GetSocket(), &Master->GetSocketSet()))
{
continue; // rien ne se passe
}
// recv: 5 premiers bytes
Receive(itr->second.GetSocket(), 5);
cout << "Received from " << itr->second.GetSocket() << ": (" << BytesReceived << ") " << Buffer << endl;
plength = lexical_cast<int>(Buffer);
cout << "packet length = " << plength << endl;
if(plength == -1)
{
}
else if(plength == 0)
{
Master->ClientDisconnection(itr->first);
}
else
{
// recv: packet
Receive(itr->second.GetSocket(), plength);
packet = Packet(Buffer);
cout << "Received: " << Buffer << endl;
clearBuffer();
// get header
header = packet.ReadInt<uint8_t>();
// now, who is this socket ?
if(itr->second.GetType() == sessiontype::unknown)
{
if(callback_unknown[header] != NULL)
{
callback_unknown[header](itr->second, packet);
}
}
}
FD_CLR(itr->second.GetSocket(), &Master->GetSocketSet());
}
}
}
void Receive(const TCPsocket& sock, const int length)
{
clearBuffer();
BytesReceived = 0;
int t = 0;
cout << "Trying to receive on socket: " << sock << " ; l=" << length << endl;
while (true) {
if (BytesReceived == length) break;
t = recv(sock, (Buffer + BytesReceived), length - BytesReceived, 0x00);
cout << "received " << t << " bytes ; buffer= " << Buffer << endl;
BytesReceived += t;
if(t <= 0)
{
cout << "Error reading socket " << WSAGetLastError() << endl;
break;
}
}
}
void clearBuffer()
{
Buffer = "";
} |
Et coté client, voici connexion + envoie dun peu de données:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
int _temp;
#if defined __MINGW32__
WSADATA _wsa;
if (WSAStartup(MAKEWORD(2,2),&_wsa) < 0)
{
exit(EXIT_FAILURE);
}
#endif
if ((_sock = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
exit(EXIT_FAILURE);
}
_saddr.sin_family=AF_INET;
_saddr.sin_addr.s_addr=inet_addr(ip);
_saddr.sin_port=htons(port);
if(connect(_sock,(struct sockaddr*)&_saddr,sizeof(_saddr)) != 0)
{
cerr << "ERROR: Could not connect to " << ip << ":" << port << endl;
exit(0);
}
cerr << "Connected to " << ip << endl;
char* buf = new char;
buf = "05 02 02\r\n";
send(_sock, buf, strlen(buf), 0x00); |
Quelqu'un saurait m'expliquer d'où vient l'erreur ?
merci, nico