Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

winsock -problem

Ostatnio zmodyfikowano 2010-11-10 16:11
Autor Wiadomość
Ernest171
Temat założony przez niniejszego użytkownika
winsock -problem
» 2010-11-06 19:34:52
Mam problem  uruchamiam serwer później klient.W kliencie podaje ip 127.0.0.1
w kliencie wyskakuje:

składowa 'tekst': Example text
składowa 'number' :1771
Rozlaczam.

a w serwerze to:
użytkownik połączony 127.0.0.1:3559
Rozlaczam.

Chciałbym się dowiedzieć jak zrobić żeby się nie rozłączało i jak dołączyć do serwery czy klienta grę żeby po połączeniu dało się grać.

OTO KOD:

serwer:

C/C++
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <string>

#pragma comment(lib, "ws2_32.lib")

#define DEFAULT_PORT        5150
#define DEFAULT_BUFFER      4096

using namespace std;

struct ExampleData
{
    char text[ 32 ];
    unsigned int number;
};

int iPort = DEFAULT_PORT; // Port

int main( int argc, char ** argv )
{
    cout << "iasdasda" << endl;
    cout << "== wdasdasdasd ==" << endl;
   
    WSADATA wsd;
    SOCKET sListen, sClient;
    int iAddrSize;
    sockaddr_in local, client;
    int iPort = DEFAULT_PORT;
   
    if( WSAStartup( MAKEWORD( 2, 2 ), & wsd ) != 0 )
    {
        cout << "Nie mozna stworzyc WinSock'a." << endl;
        return 1;
    }
   
    // Create server (listen) socket
    sListen = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
    if( sListen == SOCKET_ERROR )
    {
        cout << "Nie mozna stworzyc gniazda (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
   
    local.sin_addr.s_addr = htonl( INADDR_ANY );
    local.sin_family = AF_INET;
    local.sin_port = htons(( u_short ) iPort );
   
    if( bind( sListen,( sockaddr * ) & local, sizeof( local ) ) == SOCKET_ERROR )
    {
        cout << "Nie mozna przypisac ustawien (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
   
    listen( sListen, SOMAXCONN );
   
    cout << "Serwer uruchomiony pomyslnie." << endl;
   
    while( true )
    {
        iAddrSize = sizeof( client );
        sClient = accept( sListen,( sockaddr * ) & client, & iAddrSize );
        if( sClient == INVALID_SOCKET )
        {
            cout << "Nie mozna zaakceptowac uzytkownika (" << WSAGetLastError() << ")." << endl;
            return 1;
        }
       
        cout << "Uzytkownik polaczony: " << inet_ntoa( client.sin_addr ) << ":" << ntohs( client.sin_port ) << endl;
       
        // zwykła struktura
        ExampleData example;
        strcpy( example.text, "Example text" );
        example.number = 1771;
        char * toSend = reinterpret_cast < char *>( & example );
        send( sClient, toSend, sizeof( example ), 0 );
       
        cout << "Rozlaczam.";
       
        closesocket( sClient );
    }
   
    closesocket( sListen );
    WSACleanup();
   
    cout << "Serwer wylaczony." << endl;
    getch();
    return 0;
}


klient:



#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")

#define DEFAULT_PORT        5150
#define DEFAULT_BUFFER      4096

using namespace std;

struct ExampleData
{
    char text[ 32 ];
    unsigned int number;
};

int main( int argc, char ** argv )
{
    cout << "siemka" << endl;
    cout << "== elo ==" << endl;
   
    WSADATA wsd;
    SOCKET sClient;
    sockaddr_in server;
    hostent * host = NULL;
    char szServer[ 128 ];
    int iPort = DEFAULT_PORT;
   
    cout << "Podaj IP: ";
    cin >> szServer;
   
    // winsock
    if( WSAStartup( MAKEWORD( 2, 2 ), & wsd ) != 0 )
    {
        cout << "Nie mozna stworzyc WinSock'a." << endl;
        return 1;
    }
   
    // Utwórz gniazdo i spróbuj się połączyć z serwerem
    sClient = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( sClient == INVALID_SOCKET )
    {
        cout << "Nie mozna utworzyc gniazda (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
   
    server.sin_family = AF_INET;
    server.sin_port = htons(( u_short ) iPort );
    server.sin_addr.s_addr = inet_addr( szServer );
   
    // gf
    if( server.sin_addr.s_addr == INADDR_NONE )
    {
        host = gethostbyname( szServer );
        if( host == NULL )
        {
            cout << "Nie mozna przeksztalcic na ip: " << szServer << endl;
            return 1;
        }
        CopyMemory( & server.sin_addr, host->h_addr_list[ 0 ], host->h_length );
    }
   
    if( connect( sClient,( sockaddr * ) & server,
    sizeof( server ) ) == SOCKET_ERROR )
    {
        cout << "Nie mozna sie polaczyc (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
   
    cout << "Polaczono." << endl;
   
    char value[ DEFAULT_BUFFER ];
    int received = recv( sClient, value, DEFAULT_BUFFER, 0 );
    ExampleData * example = reinterpret_cast < ExampleData *>( value );
    cout << "Skladowa 'text': " << example->text << endl;
    cout << "Skladowa 'number':" << example->number << endl;
   
    cout << "Rozlaczam." << endl;
   
    closesocket( sClient );
    WSACleanup();
   
    getch();
    return 0;
}



Z góry dziękuje
P-23612
ison
» 2010-11-06 20:03:28
wszystko działa jak należy, wysyłasz 1 wiadomość i tuż po tym wypisujesz na standardowe wyjście "Rozlaczam"
jeśli chcesz wysyłać więcej niż tylko 1 wiadomość to zrób odpowiednią pętlę i pokombinuj ;p
P-23614
Ernest171
Temat założony przez niniejszego użytkownika
winsock
» 2010-11-07 12:11:44
Mógłby mi ktoś powiedzieć jak dołączyć do tego grę.
Chodzi mi oto że jak się połączę to żeby można było grać.
P-23645
ison
» 2010-11-07 13:14:23
najpierw tę grę wypadałoby napisać :D
sam winsock nie załatwia sprawy

jeśli chcesz się komunikować z klientem bądź serwerem bez ustanku to zrób pętlę while w której będziesz cały czas wysyłał informacje na przykład o swoim położeniu w grze
C/C++
while( /*jakis warunek określający kiedy przerwać połączenie*/ )
{
    send( /*socket*/, /*wiadomosc w postaci tablicy charów*/, /*rozmiar wiadomości*/, 0 ); //wysylanie swoich informacji
    recv( /*socket*/, /*wiadomosc do odebrania*/, /*rozmiar wiadomosci*/, 0 ); //odbieranie informacji od klienta bądź hosta
}
P-23647
Ernest171
Temat założony przez niniejszego użytkownika
winsock
» 2010-11-07 14:29:14
Powiedzmy że napisałem grę to co zrobić żeby po połączeniu z serwerem klient uruchamiał gre?
Przecież jak będę miał grę i się połącze z serwerem to gra się nie uruchomi sama.
P-23648
ison
» 2010-11-07 15:11:44
musisz połączyć te obie rzeczy na raz w jednym programie...
to nie jest tak że możesz do każdej istniejącej gry singleplayer dopisać bez problemu multiplayer
aby w daną grę było można grać przez sieć to trzeba zrobić takie założenie zanim zacznie się pisać grę

zacznij od zakodzenia zwykłego komunikatora konsolowego z użyciem winsock'a - na robienie gier będzie jeszcze czas
P-23653
Ernest171
Temat założony przez niniejszego użytkownika
Winsock
» 2010-11-07 19:39:19
A co konkretnie połączyć w jeden program?

I "trzeba zrobić takie założenie zanim zacznie się pisać grę"  jakie założenie .
Mam klienta i serwer ,a od czego zacząć pisąć gre?


P.S
I jak zrobić pętle sprawdzającą połączenie w kliencie i w serwerze?
P-23674
ison
» 2010-11-07 19:57:35
A co konkretnie połączyć w jeden program?
grę i połączenie sieciowe z użyciem winsock'a

jakie założenie
aby zanim zacznie się pisać grę zdecydować czy ma być multiplayer czy singleplayer

Mam klienta i serwer ,a od czego zacząć pisąć gre?
"mam 1 cegłę, od czego zacząć budować wieżowiec?"
od złej strony zaczynasz robić grę, najpierw poznaj jakąś bibliotekę graficzną, albo spróbuj chociaż zrobić coś w konsoli... zazwyczaj robienie samego silnika gry zajmuje dużo więcej czasu niż obsługa połączenia sieciowego
olej na ten czas naukę winsocka i zacznij od podstaw robienia gier
P-23678
« 1 » 2 3 4
  Strona 1 z 4 Następna strona