 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Faller Junior JLI'ler
Alter: 37 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 24.12.2006, 15:00 Titel: sockets fehlerhaft |
|
|
Ich versuche mit sockets Daten über das Internet zu verschicken. Damit mein späteres Spiel dies auch machen kann, dafür habe ich auf folgender Seite gefunden die dies gut erklärt.
http://www.pc-adviser.de/socket_programmierung.html#recv
ausdem habe ich mir dann 2 einfache Programme gebaut die eine verschickt die andere nimmt entgegen.
Nach einigen test scheint es so als ob der entgegennehmende ein Fehler hat denn ich nicht finden kann. Es könnte aber auch das verschickende sein was probleme macht. Da ich es kaum testen kann da ich nur einen Computer besitze möchte ich euch darum bitten. um den Fehler zu finden oder ihn gar zu beseitigen. Beide Programme nutzen den Port 6112.
so hier der code für den verschickenden
CPP: | #include <winsock.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define BUF_SIZE 1024
struct sockaddr_in addr;
int main()
{
SOCKET s=0;
addr.sin_addr.s_addr=inet_addr("89.60.223.133");
addr.sin_port =htons(6112);
addr.sin_family = AF_INET;
/* initialize windows sockets */
WSADATA wsa;
if (WSAStartup(MAKEWORD(1, 1), &wsa))
{
printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
}
//socket erstellen
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror("socket() failed");
}
//connecten
connect(s, (struct sockaddr*) &addr, sizeof(struct sockaddr_in));
int bytes;
char buffer[] = "Wir\r\n";
bytes = send(s, buffer, strlen(buffer), 0);
if(bytes==-1)
printf("es konnte net gesendet werden\n");
else
printf("%i\n",bytes);
getch();
//close(s);
return 0;
}
|
und hier der code für das anhemende Programm
CPP: | #include <winsock.h>
#include <stdio.h>
#include<windows.h>
#define BUF_SIZE 200
struct sockaddr_in addr;
int main()
{
SOCKET s=0;
SOCKET client=0;
char buffer[BUF_SIZE]={'f'};
int bytes;
struct sockaddr_in cli;
int cli_size;
int i=0;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port =htons(6112);
addr.sin_family = AF_INET;
/* initialize windows sockets */
WSADATA wsa;
if (WSAStartup(MAKEWORD(1, 1), &wsa))
{
printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
}
//socket erstellen
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror("socket() failed");
}
//connecten
bind(s, (struct sockaddr*) &addr, sizeof(struct sockaddr_in));
//warten bis jemand schickt
listen(s, 3);
for(;;)
{
cli_size = sizeof(cli);
accept(s, (struct sockaddr*) &cli, &cli_size);
printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));
bytes = recv(s, buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
printf("Client: %s\n", buffer);
printf("es wurden %i daten emfangen",bytes);
}
closesocket(s);
return 0;
}
|
hier ist noch ein bild link mit dem was auf dem Server passiert
http://uploaded.to/?id=f9337b
so ich wünsche allen gute weinachten weil ich fahre jetze zu Verwanden und da ist mir Progen erstma egal ich hoffe das ihr mir helfen könnt
thx im voraus
Edit by Kampfhund: code- durch cpp-Tags ersetzt. Bitte in Zukunft cpp-Tags für c++-Codeausschnitte verwenden. _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.12.2006, 23:22 Titel: |
|
|
Nur ein COmputer? Na und? Nimm einfach den Lokalhost! Einfach als IP 127.0.0.1 angeben und schon haste immer deinen eigenen Computer.
D.h. du startest Server und Client auf einem Rechner und nimsmt immer die IP 127.0.0.1 _________________ https://jonathank.de/games/
Zuletzt bearbeitet von Jonathan_Klein am 24.12.2006, 23:36, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.12.2006, 23:36 Titel: |
|
|
so hab ichs nich gemeint, [Typo by AFE-GmdG]: kam[/Typo] wohl doof rüber. Habs geändert  _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Faller Junior JLI'ler
Alter: 37 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 25.12.2006, 19:49 Titel: |
|
|
Ok danke, jetze kann ich nadürlich besser testen. Hab es nadürlich gleich ausprobiert aber der eigentliche Fehler bleibt. Nämlich das ich nix anhemnen kann so gibt das eine Programm es richtig ab aber das andere nimt es nicht an
hat jamnd von euch schonmal daten mit c über das internet geschickt wenn ja ich wäre für jedes beispiel zu haben. _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 25.12.2006, 20:24 Titel: |
|
|
Ich kann dir nur folgendes empfehlen:
http://www.zotteljedi.de/doc/socket-tipps/index.html _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.12.2006, 20:37 Titel: |
|
|
Also ich würde dir die Tutorials von www.c-worker.ch empfehlen. Falls es nicht an deinem Programm selber liegt solltest du mal deine Windowsfirewall oder sonstige Softwarefirewall prüfen ob die vieleicht sperrt. Deinen Quellcode hab ich mir noch nicht angesehen, werd aber mal drüberschaun falls es nicht schon vorher gelöst wird. |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.12.2006, 20:43 Titel: |
|
|
Ich hab mir jetzt mal den Code angesehen.
Der Fehler kommt daher das du den Socket zum empfangen nehemn willst der auch auf eingehende Verbindungen wartet.
Wie du den Port bindest und auf eine Verbindung wartest ist ok. Wurde jetzt die Verbindung angenommen musst du einen neuen Socket erstellen und diesen zum Senden und Empfangen verwenden.
Der Socket der an den Port gebunden ist und auf Verbindungen wartet kann niemals (bei TCP/IP) zum Senden und Empfangen von Daten verwendet werden. |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.12.2006, 20:52 Titel: |
|
|
Ich hab deinen Code (Server) mal ergänzt. Sofern der Rest stimmt, kannst du es so verwenden.
Aber wie gesagt schau dir die Tuts von www.c-worker.ch an, die sind wirklich gut und erklären alles was du brauchst.
CPP: |
#include <winsock.h>
#include <stdio.h>
#include<windows.h>
#define BUF_SIZE 200
struct sockaddr_in addr;
int main()
{
SOCKET s=0;
SOCKET client=0;
char buffer[BUF_SIZE]={'f'};
int bytes;
struct sockaddr_in cli;
int cli_size;
int i=0;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port =htons(6112);
addr.sin_family = AF_INET;
/* initialize windows sockets */
WSADATA wsa;
if (WSAStartup(MAKEWORD(1, 1), &wsa))
{
printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
}
//socket erstellen
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror("socket() failed");
}
//connecten
bind(s, (struct sockaddr*) &addr, sizeof(struct sockaddr_in));
for(;;)
{
//warten bis jemand schickt
listen(s, 3);
cli_size = sizeof(cli);
// Verbindung akzeptieren und neuen Socket erstellen
SOCKET connectedSocket = accept(s, NULL,NULL);
printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));
if(connectedSocket ==INVALID_SOCKET)
{
// Fehlerbehandlung
}
else
{
bytes = recv(connectedSocket , buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
printf("Client: %s\n", buffer);
printf("es wurden %i daten emfangen",bytes);
}
// Socket der aktuellen Verbindung schließen
closesocket(connectedSocket )
}
closesocket(s);
// GANZ WICHTIG !
WSACleanup();
return 0;
}
|
|
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 25.12.2006, 21:08 Titel: |
|
|
Faller hat Folgendes geschrieben: |
hat jamnd von euch schonmal daten mit c über das internet geschickt wenn ja ich wäre für jedes beispiel zu haben. |
Jo, ich habe das mal gemacht. Das Nachrichten senden von meinem PC über WLAN an meinen Laptop hat geklappt.
Quellcode:
CPP: | #include <winsock2.h>
#include <windows.h>
#include <iostream>
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char byte;
//=============================================================================
//
//
//=============================================================================
ushort WinsockVersion(byte major,byte minor)
{
return (static_cast<short>(minor)<<8)+major;
}
//=============================================================================
//
//
//=============================================================================
bool StartWinsock()
{
WSADATA sock_data;
long result = WSAStartup(WinsockVersion(2,0),&sock_data);
if(result==0)
{
std::cout<<"Winsock started"<<std::endl;
}
else
{
std::cout<<"error starting Winsocket"<<std::endl;
std::cin.get();
return false;
}
return true;
}
//=============================================================================
//
//
//=============================================================================
bool ConnectClientSocket(SOCKET client,char* ip,ushort port)
{
SOCKADDR_IN address;
long result;
ZeroMemory(&address,sizeof(SOCKADDR_IN));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
result = connect(client,(SOCKADDR*)&address,sizeof(SOCKADDR));
if(result == SOCKET_ERROR)
{
return false;
}
return true;
}
//=============================================================================
//
//
//=============================================================================
bool CreateListenServerSocket(SOCKET server,ushort port)
{
SOCKADDR_IN address;
long result;
ZeroMemory(&address,sizeof(SOCKADDR_IN));
address.sin_family = AF_INET;
address.sin_addr.s_addr = ADDR_ANY;
address.sin_port = htons(port);
result = bind(server,(SOCKADDR*)&address,sizeof(SOCKADDR));
if(result == SOCKET_ERROR)
{
return false;
}
result = listen(server,10);
if(result == SOCKET_ERROR)
{
return false;
}
return true;
}
//=============================================================================
//
//
//=============================================================================
bool StartServer()
{
SOCKET acceptor;
SOCKET client;
bool success;
std::cout<<"creating listen server socket: ";
acceptor = socket(AF_INET,SOCK_STREAM,0);
success = CreateListenServerSocket(acceptor,4444);
if(success)
{
std::cout<<"ok"<<std::endl;
}
else
{
std::cout<<"failed"<<std::endl;
closesocket(acceptor);
return false;
}
std::cout<<"waiting for clients..."<<std::endl;
client = accept(acceptor,NULL,NULL);
if(client != INVALID_SOCKET)
{
std::cout<<" client accepted"<<std::endl;
}
else
{
std::cout<<"error accepting"<<std::endl;
closesocket(acceptor);
closesocket(client);
return false;
}
char buffer[256];
long data_count;
std::cout<<"recieving..."<<std::endl;
data_count = recv(client,buffer,256,0);
if(data_count != SOCKET_ERROR)
{
buffer[data_count]='\0'; // Hey, wo schreibt der da eigentlich hin?
std::cout<<"recieved message: "<<buffer<<std::endl;
}
else
{
std::cout<<"error recieving message"<<std::endl;
closesocket(acceptor);
closesocket(client);
return false;
}
return true;
}
bool StartClient()
{
SOCKET client;
bool success = false;
char* data = "hello server";
client = socket(AF_INET,SOCK_STREAM,0);
std::cout<<"connecting to server: ";
success = ConnectClientSocket(client,"127.0.0.1",4444);
if(success)
{
std::cout<<" ok"<<std::endl;
}
else
{
std::cout<<"error connecting"<<std::endl;
closesocket(client);
return false;
}
std::cout<<"sending message: "<<data<<std::endl;
long data_count = send(client,data,13,0);
if(data_count != SOCKET_ERROR)
{
std::cout<<"characters sent: "<<data_count<<std::endl;
}
else
{
std::cout<<"error while sending"<<std::endl;
closesocket(client);
return false;
}
return true;
}
int main()
{
char option = '_';
StartWinsock();
do
{
std::cout<<"(e)xit; start (s)erver; start (c)lient;"<<std::endl;
std::cin>>option;
switch(option)
{
case 'e':
break;
case 's':
StartServer();
break;
case 'c':
StartClient();
break;
default:
option = '_';
break;
}
}
while(option != 'e');
WSACleanup();
std::cin.get();
return 0;
}
|
_________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.12.2006, 21:24 Titel: |
|
|
Hier hatte sich wohl ein Fehler eingeschlichen
Kamfhund hat Folgendes geschrieben: |
CPP: | ushort WinsockVersion(byte major,byte minor)
{
return (static_cast<short>(minor)<<8)+major;
}
|
|
so wäre es richtig
CPP: | ushort WinsockVersion(byte major,byte minor)
{
return (static_cast<ushort>(minor)<<8)+major;
}
|
|
|
Nach oben |
|
 |
Faller Junior JLI'ler
Alter: 37 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 27.12.2006, 10:26 Titel: |
|
|
ich Danke für die vielen Antworten hab es auch gleich ausprobiert und es funst jer. Danke auch an für die vielen internetseiten danke jetze kann ich endlich weiter machen
*close* _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|