Bonjour,
je bloque actuellement sur un problème de réseau. En effet, lors du chargement des éléments initiaux envoyée par le serveur, le select ne semble pas fonctionner correctement.
Lorsque je vérifie la valeur de select, celui ci me renvoie toujours -1. Donc j'ai sauter l'étape de vérification du select...
Or, lors du chargement du jeu, lorsqu'il n'y a plus rien a recv(), la fenêtre se bloque. Et j'ai un jolie _Ne repond plus_ de la fenetre apparait. Apres le debug, j'ai vu que même si le serveur n'envoyait plus rien, get_buffer etait appeler, et ca bloquait sur le recv().
Le fait que select() renvoie toujours -1 a-t-il son importance ?
mon main :
Code c++ :
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <windows.h>
#include <iostream>
#include <string>
#include <fcntl.h>
#include <unistd.h>
int main
(int argc
, char** argv
){ struct scene_info s
; char ip
[20]; int port
; WSADATA wsaData
; SOCKET sock
; SOCKADDR_IN sin
; fd_set fd_read
; std
::string full_buf
; timeval tv
; if((WSAStartup
(MAKEWORD
(2,0), &wsaData
)) != 0) exit(99); port
= 1234; strcpy
(ip
, "192.168.254.42"); sock
= socket
(AF_INET
, SOCK_STREAM
, 0); if (sock
== INVALID_SOCKET
) exit(88); sin
.sin_addr
.s_addr
= inet_addr
(ip
); sin
.sin_family
= AF_INET
; sin
.sin_port
= htons
(port
); tv
.tv_sec
= 0; tv
.tv_usec
= 7; if (connect
(sock
, (SOCKADDR
*)&sin
, sizeof(sin
)) == SOCKET_ERROR
) { std
::cout
<< "connect error\n" ; exit(3); } init_basic
(&s
); create_decor
(); while(device
->run
()) { driver
->beginScene
(true, true, SColor(255,100,100,100)); FD_ZERO
(&fd_read
); FD_SET
(0, &fd_read
); FD_SET
(sock
, &fd_read
); select
(sock
+ 1, &fd_read
, NULL
, NULL
, NULL
); if (FD_ISSET
(sock
, &fd_read
)) { full_buf
+= get_buffer
(sock
, &fd_read
); if ( full_buf
.find
("\n") != -1) { treat_buffer
(&s
, full_buf
, sock
); full_buf
.clear
(); } } smgr
->drawAll
(); guienv
->drawAll
(); driver
->endScene
(); } device
->drop
(); closesocket
(sock
); WSACleanup
(); return 0;}
et get_buffer() :
Code c++ :
std
::string get_buffer
(SOCKET socket
, fd_set
*fd_read
){ int nb_read
; char buf
[1]; std
::string tmp_buf
; std
::cout
<< "192.168.254.42" << std
::endl
; nb_read
= recv
(socket
, buf
, 1, 0); if ( nb_read
== -1) { std
::cout
<< "connect error\n" << std
::endl
; exit(-12); } else { tmp_buf
.assign
(buf
); std
::cout
<< "\n" << tmp_buf
<< std
::endl
; } return (tmp_buf
);}