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:
#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;
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; } 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; 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; if( WSAStartup( MAKEWORD( 2, 2 ), & wsd ) != 0 ) { cout << "Nie mozna stworzyc WinSock'a." << endl; return 1; } 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 ); 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
|
|
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 |
|
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ć. |
|
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 while( ) { send( , , , 0 ); recv( , , , 0 ); }
|
|
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. |
|
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 |
|
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? |
|
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 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 |
|
« 1 » 2 3 4 |