#1 

19-06-2010 01:54:59

bledfeet
Membres
Date d'inscription:
Messages: 4
IP: 79.89.60.70
Courriel

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\
" ;
        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("\
") != -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 << "ONE" << std::endl;

    nb_read = recv(socket, buf, 1, 0);
    if ( nb_read == -1)
    {
        std::cout << "bad read" << std::endl;
        exit(-12);
    }
    else
    {
        tmp_buf.assign(buf);
      std::cout << "get_buffer() : " << tmp_buf << std::endl;
    }
    return (tmp_buf);
}


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
168 invités en ligne
membre en ligne: -
RSS Feed