TCP/IP Problem Socketprogrammierung

Winner

Erfahrenes Mitglied
Hallo zusammen!

Ich sitze jetzt schon über einen halben Tag und komme mit meinen Problem nicht weiter. Ich verwedne vs c++ als konsolen programm! Es soll eine client programm werden.

Ich bekomme leider noch nicht mal angezeigt, das keine Verbindung betseht denn beim ertzeugen der exe datei tretten fehler auf, die aber beim compilieren nicht da sind. Kann mir einer sagen wo dran das liegt!

Erstmal Post ich euch den Code und dann die Meldungen! Wäre echt super, wenn ihr mir Tipss geben könnt, denn das ist für mich noch Neuland. Habe vorher einige Tutorials gemacht und habe mir den Code dann so zusammen gebastelt!

Bitte um Hilfe
Code:
/*****************************************************************/
/* Beschreibung: Client-Programm                                 */
/*               baut eine TCP-Verbindung zu einem Server auf.   */
/*               IP-Adresse und Port-Nummer sind Kommandozeilen- */
/*               parameter und damit variabel                    */
/*****************************************************************/
#include <sys/types.h>
//#include <sys/socket.h>
#include <stdio.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
#include <dos.h>

#include <conio.h>
#include<windows.h>

#include <winsock.h>
#include <io.h>
#include<dos.h>

//#include <WSock32.lib>

//#include <winsock.lib>

int main()
  {



	SOCKET MySocket;
   	char serverip[20];
	sockaddr_in addr;
	WSADATA wsaData;

/*	if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
	{
		MessageBox(0,"WSA konnte nicht initialisiert werden","Fehler",MB_OK);
		return false;
	}*/

	hostent* dns = gethostbyname("localhost");
	sprintf(serverip, "%u.%u.%u.%u",(unsigned char) dns->h_addr_list[0][0],
		(unsigned char) dns->h_addr_list[0][1], (unsigned char) dns->h_addr_list[0][2], 
		(unsigned char) dns->h_addr_list[0][3]);

	addr.sin_family = AF_INET;
	addr.sin_port = htons(80);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	//addr.sin_addr.s_addr = ADDR_ANY;//inet_addr(serverip);

	MySocket = socket( AF_INET, SOCK_STREAM,0);

	if(MySocket == 0)
	{
		MessageBox(0,"Socket konnte nicht initalisiert werden","Fehler",MB_OK);
			return false;
	}

	if(connect(MySocket, (sockaddr *) &addr, sizeof(addr)) == -1)
	{
		MessageBox(0,"Es konnte keine Verbindung aufgebaut werden","Fehler",MB_OK);
		return false;
	}

	return true;



}


Und nun die Fehler:

Code:
client2.obj : error LNK2001: unresolved external symbol _connect@12
client2.obj : error LNK2001: unresolved external symbol _socket@12
client2.obj : error LNK2001: unresolved external symbol _inet_addr@4
client2.obj : error LNK2001: unresolved external symbol _htons@4
client2.obj : error LNK2001: unresolved external symbol _gethostbyname@4
Debug/client2.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
 
Hi,

wie es aussieht fehlen bei dir die Libs. Du musst die WSock32.lib dazulinken, dann müsste es klappen.

Gruß
cesupa
 
Das habe ich auch gerade gesehen! Habe so eben unter Projekteigenschaften _Eigenschaften - Link die entsprechende ws2_32.lib eingefügt! Jetzt schmiert er total ab.

Oder meinst du das ich irgendwas per include rein bringen muss, ja oder.

Wie sieht der Befehl aus! Meine ich das hätte ich doch schon mal gemacht gehabt vorher zu mindest

Code:
#include <WSock32.lib>

da sagt er, das fatal error C1083: Cannot open include file: 'WSock32.lib': No such file or directory

man stehte gerade auf dem schlauch
 
Die lib kannst du nicht mit include einbinden
Bind die Lib in die Projekteigenschaften UND dann include
"WinSock.h" oder so ähnlich.

Sheel
 
1. Wieso erst per gethostbyname() den Hostnamen zu einer IPv4-Addresse umwandeln, wenn du s_addr nacher eh per inet_addr( "127.." ) füllst?

2. Entkommentier WSAStartup, das ist für Sockets unter windows lebenswichtig.

3. Mit closesocket( socket ) und WSACleanup() aufräumen

Viel Spaß bei den Sockets ;-).
 
Also guten morgen und schon mal danke für eure hilfe!

Ich bin aber leider noch kein Stück weiter! Ich habe nun das Startup wieder frei gemacht also das der Qeulltext nicht auskommentiert ist, aber es klappt immer noch nicht! Ich habe versucht die lib datei einzubinden aber leider ohne Erfolg! Hat einer von euch einen laufendes Codebeispiel?`?

Wäre danbar drum oder könnt ihr mir anders wieterhelfen! Gruß
 
Hallo, hier mal ein Beispiel für einen Client. Die Winsock-Library wird über die pragma-Direktive eingebunden:
C++:
#include <windows.h>
#include <winsock.h>
#pragma comment (lib, "Ws2_32.lib")

int main(int argc, char* argv[])
{
    ///////////////////////////////////////////////////////////
    // Socket initialisieren (nur einmal beim Programmstart)
    ///////////////////////////////////////////////////////////

    WSADATA wsa;

    if( WSAStartup(MAKEWORD(2,2), &wsa) )
    {
        return 1; // Initialisierung fehlgeschlagen
    }

    ///////////////////////////////////////////////////////////
    // Verbindung aufbauen und Senden bzw. Empfangen
    ///////////////////////////////////////////////////////////
   
    int    nPort = 1234; // Portnummer
    SOCKET sock  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if( sock != INVALID_SOCKET )
    {
        struct sockaddr_in saddr;
        struct hostent *pHost;
        
        // Verwendung des Servernamens
        pHost = gethostbyname("localhost");

        // oder Verwendung einer IP-Adresse
        //unsigned int addr  = inet_addr("127.0.0.1");
        //pHost = gethostbyaddr((char *) &addr, 4, AF_INET);

        saddr.sin_family = AF_INET;
        saddr.sin_port   = htons(static_cast<u_short>(nPort));
        saddr.sin_addr   = *reinterpret_cast<struct in_addr*>(pHost->h_addr);

        if( connect(sock, reinterpret_cast<struct sockaddr *>(&saddr), sizeof(saddr)) != 0 )
        {
            char SendBuffer[] = { 0x00, 0x01, 0x02, 0x03 };    // Sendedaten zuweisen
        
            if( send(sock, SendBuffer, sizeof(SendBuffer), 0) != SOCKET_ERROR ) // Senden
            {
                char RecvBuffer[1024];
                int  nRead = recv(sock, RecvBuffer, sizeof(RecvBuffer), 0);     // Empfangen

                if( nRead > 0 )
                {
                    // Empfang Ok, "nRead" enhält die Anzahl der empfangenen Bytes
                }
            }
        
            closesocket(sock); // Verbindung abbauen
        }
    }       

    WSACleanup(); // Winsock deinitialisieren
    return 0; 
}
Gruß
MCoder
 
Zurück