JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

sockets fehlerhaft

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 24.12.2006, 15:00    Titel: sockets fehlerhaft Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.12.2006, 23:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 24.12.2006, 23:32    Titel: Antworten mit Zitat

Hey, es ist Weihnachten. Nicht so agressiv.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.12.2006, 23:36    Titel: Antworten mit Zitat

so hab ichs nich gemeint, [Typo by AFE-GmdG]: kam[/Typo] wohl doof rüber. Habs geändert Smile
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Faller
Junior JLI'ler


Alter: 37
Anmeldedatum: 30.11.2006
Beiträge: 88
Wohnort: Dresden
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 19:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 20:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 20:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 20:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 20:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 21:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 21:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Faller
Junior JLI'ler


Alter: 37
Anmeldedatum: 30.11.2006
Beiträge: 88
Wohnort: Dresden
Medaillen: Keine

BeitragVerfasst am: 27.12.2006, 10:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum