#0 

19-06-2010 03:54:59

bledfeet
Petit nouveau
Date d'inscription: 08-06-2010
Messages: 4

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);
}

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
47 invités en ligne
Aucun membre connecté
RSS Feed