TCP Client/Server
-
Hallo erstmal,
bin neu hier und hoffe ihr könnt mir mit meine Problem weiterhelfen.
ich will eine ganz simple TCP Verbindung zwischen nem Server Programm und nem Client Programm herstellen, aber irgendwie will es nicht...
WSAStartup(),Socket(), bind() initialisieren sich erfolgreich auf der Client und Server-Seite
Probleme machen Connect, liefert immer -1 zurück und accept welches nach Starten das Programm zum hängen bringt. Bei letzterem bin ich mir nciht sicher ob es normal ist, von wegen Blocking-Mode und warten bis eine Verbindung acceptet werden kann.
Ich habe schon mehrere Quellcodes runtergeladen, aber ich bekomme es selber einfach nicht hin und finde den Fehler nicht. Ich nutze WinXP und den C Builder 6 von Borland
Hier mein Quellcode des Clients:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <errno.h> #include <string> #define AF_INET 2 //Internet Protocol #include <fcntl.h> #include <winsock.h> #include "Client.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int sockfd,servSock; struct sockaddr_in con_addr, serv_addr; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { con_addr.sin_family = AF_INET; con_addr.sin_port = htons(3131); con_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(3131); serv_addr.sin_addr.s_addr = INADDR_ANY; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { Ausgabe->Lines->Add("WSAStartup(): Kann Winsock nicht initialisieren."); exit (EXIT_FAILURE); } else Ausgabe->Lines->Add("WSAStartup():erfolgreich."); sockfd = socket(AF_INET, SOCK_STREAM,0); if (sockfd == -1) { perror ("socket()"); Ausgabe->Lines->Add("Socket initialisierung fehlgeschlagen"); } else Ausgabe->Lines->Add("Socket initialisierung erfolgreich"); if (bind(sockfd, (sockaddr *)&con_addr, sizeof(sockaddr)) == -1) { perror ("bind()"); Ausgabe->Lines->Add("Bind initialisierung fehlgeschlagen"); } else Ausgabe->Lines->Add("Bind initialisierung erfolgreich"); } //--------------------------------------------------------------------------- void __fastcall TForm1::ExitBtnClick(TObject *Sender) { exit(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::ConBtnClick(TObject *Sender) { if(connect(sockfd, (sockaddr *)&serv_addr, sizeof(sockaddr)) == -1) { perror ("connect()"); Ausgabe->Lines->Add("Connect initialisierung nicht erfolgreich"); } else Ausgabe->Lines->Add("Connect initialisierung erfolgreich"); } //---------------------------------------------------------------------------und hier der des Servers:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Server.h" #include <errno.h> #include <string> #define AF_INET 2 //Internet Protocol #include <fcntl.h> #include <winsock.h> #include <time.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int sockfd; struct sockaddr_in con_addr, client_addr; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { con_addr.sin_family = AF_INET; con_addr.sin_port = htons(3131); con_addr.sin_addr.s_addr = INADDR_ANY; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { Ausgabe->Lines->Add("WSAStartup(): Kann Winsock nicht initialisieren."); exit (EXIT_FAILURE); } else Ausgabe->Lines->Add("WSAStartup():erfolgreich."); sockfd = socket(AF_INET, SOCK_STREAM,0); if (sockfd == -1) { perror ("socket()"); Ausgabe->Lines->Add("Socket initialisierung fehlgeschlagen"); } else Ausgabe->Lines->Add("Socket initialisierung erfolgreich"); if (bind(sockfd, (sockaddr *)&con_addr, sizeof(sockaddr)) == -1) { perror ("bind()"); Ausgabe->Lines->Add("Bind initialisierung fehlgeschlagen"); } else Ausgabe->Lines->Add("Bind initialisierung erfolgreich"); if (listen (sockfd, 5) == -1) { perror ("listen()"); Ausgabe->Lines->Add("Listen initialisierung fehlgeschlagen"); } else Ausgabe->Lines->Add("Listen initialisierung erfolgreich"); } //--------------------------------------------------------------------------- void __fastcall TForm1::ExitBtnClick(TObject *Sender) { exit(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::AcceptBtnClick(TObject *Sender) { int rlen; rlen=sizeof client_addr; if ((accept(sockfd, (struct sockaddr*)&client_addr, &rlen)) < 0) { perror("accept error"); Ausgabe->Lines->Add("Accept fehlgeschlagen"); } else Ausgabe->Lines->Add("Accept erfolgreich"); } //---------------------------------------------------------------------------
-
Beim Connect ist serv_addr ja auch mit INADDR_ANY gefüllt. Soll er sich mit irgendeinem Rechner verbinden? Du musst ihm schon eine Adresse mitteilen

Was das Blockieren bei Accept angeht -> ist normal.
-
Der C++ Builder 6 hat doch schon fertige Client / Server Module !?
Warum das Rad neu erfinden ???
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was INADDR_ANY angeht so will ich testhalber client und Server erstmal auf einem Rechner laufen lassen und dann ist es ja beim Client und auch beim Server die Selbe, oder? Habe es auch schon mit my_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); probiert.... aber da wollte Connect auch nicht
und was das Rad neu Erfinden angeht:
Es geht mehr um einfach mal etwas Erfahrung im Bereich TCP Programmierung (also Basics) zu bekommen als ein produktives Programm zu schreiben.
-
Hat denn niemand eine Idee?
-
kenne mich da leider nicht so aus...
aber wenn ich das richtig verstanden habe, nutzt du ja die winsockets und greifst nicht auf die VCL zurück -> kein BCB/VCL Problem.ich würde mal ein Moderator lieb fragen ob er dich in das entsprechende Forum schiebt. dort hast du evtl mehr erfolg
-
Vielleicht hilft dir das weiter:
/***************************************************************************** * * open a tcp connection * * DestIPStr: destionation IP address format xxx.xxx.xxx.xxx * ClientPort: local port (0=random port) * HostPort: remote port * error: TCP/IP error * * * return: socket descriptor (-1 = error) */ int tcp_connect(char *DestIPStr, unsigned int ClientPort, unsigned int HostPort, int *error) { struct sockaddr_in addr; unsigned long DestIPAddr; int sd; // socket descriptor int dummyerror; // open socket sd = opensocket(SOCK_STREAM,error); if (sd==-1 || *error!=0) { return -1; } addr.sin_family = PF_INET; addr.sin_port = htons(ClientPort); // convert byte order addr.sin_addr.s_addr = 0; if (ClientPort!=0) { // force client port bind(sd, (struct sockaddr *)&addr, error); if (*error!=0) { closesocket(sd, &dummyerror); return -1; } } addr.sin_port = htons(HostPort); // convert byte order // convert server IP address string to binary *error = inet_addr(DestIPStr,&DestIPAddr); if (*error!=0) { closesocket(sd, &dummyerror); return -1; } addr.sin_addr.s_addr = DestIPAddr; // establish a connection to the FTP server connect(sd, (struct sockaddr *) &addr, error); if (*error!=0) { closesocket(sd, &dummyerror); return -1; }; *error = 0; return sd; } // tcp_connect()