[C++] Sockets - jetzt unter Windoof

[Moepi]1

Lt. Commander
Registriert
Jan. 2002
Beiträge
1.233
Ich brauch mal wieder Eure Hilfe. Nachdem mein Proggie unter Linux jetzt ganz gut läuft, soll es auf Windows portiert werden. Optimalerweise sollte natürlich ein Quelltext exisitieren, der unter beiden Betriebssystemen kompiliert. Also dürfen die Veränderungen nicht allzu groß werden.
Erster Schritt war, die linuxspezifischen Headerfiles für die Sockets durch die winsock.h zu ersetzen. Zweiter Schritt war die Implementierung der offenbar von Windows verlangten Initialisierung der Winsock. Das Codefragment sieht jetzt so aus:

Header:
Code:
#ifndef MYNET_H
#define MYNET_H

// #include <sys/types.h>
// #include <sys/socket.h>
#include <string>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <unistd.h>
#include <stdlib.h>
#include <winsock.h>
#include <io.h>


class Mynet
{
	public:
		Mynet(void);
		int connectToServer(int port, int ip);
		int sendData(int current_commands[]);
		int recvData();
		bool connected;
	private:
		struct sockaddr_in cli_sock_info;
		int cli_sock;
		int result;
};

#endif

Code:
Code:
#include "mynet.h"
#include "stdio.h"


Mynet::Mynet(void)
{
	connected = false;
}


int Mynet::connectToServer(int port, int ip)
{
	WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD (1, 1);
  if (WSAStartup(wVersionRequested, &wsaData) != 0)
  {
		return -1;
	}
	
	cli_sock_info.sin_family = AF_INET;
	cli_sock_info.sin_addr.s_addr = htons(ip);
	cli_sock_info.sin_port = htons(port);
	cli_sock = socket(AF_INET, SOCK_STREAM, 0);

	result = connect(cli_sock, (struct sockaddr *)&cli_sock_info, sizeof(cli_sock_info));
	if(result == 0)
	{
		connected = true;
	}
	else
	{
		connected = false;
	}
	return result;
}


int Mynet::sendData(int current_commands[])
{
	int bytes_sent;
	bytes_sent = send(cli_sock, (const char*)current_commands, 2*sizeof(int), 0);
	return bytes_sent;
}


int Mynet::recvData()
{
}

Die auskommentierten Zeilen waren für Linux. So das kompiliert auch schon mal, allerdings wirft mir der Compiler (mingw) unter Windows am Ende jedes mal folgende Fehlermeldungen:

Code:
release\mynet.o(.text+0x3f):mynet.cpp: undefined reference to `WSAStartup@8'
release\mynet.o(.text+0x5d):mynet.cpp: undefined reference to `htons@4'
release\mynet.o(.text+0x72):mynet.cpp: undefined reference to `htons@4'
release\mynet.o(.text+0x94):mynet.cpp: undefined reference to `socket@12'
release\mynet.o(.text+0xb5):mynet.cpp: undefined reference to `connect@12'
release\mynet.o(.text+0xf6):mynet.cpp: undefined reference to `send@16'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\RemoteControl-v04.exe] Error 1
mingw32-make: *** [release] Error 2

Ich steig einfach net ganz dahinter warum... :(
 
Du musst die Socket-Bibliothek dazu linken. Genauso wie du unter Linux -lsocket machst, musst du die auch unter Windows dazu linken. Ich glaube die heißt ws32.lib. Schau am Besten mal bei Microsoft in der MSDN nach.
 
ich hab hier eine mingw-installation in codeblocks, da heißt die datei "libwsock32.a" und befindet sich im lib-verzeichnis von mingw. wenn du in einer entwicklungsumgebung àla devc++ oder codeblocks arbeitest, dann kannst du die einfach grafisch einbinden, ansonsten musst du sie ins make-file reinfummeln.
 
wolf schrieb:
ich hab hier eine mingw-installation in codeblocks, da heißt die datei "libwsock32.a" und befindet sich im lib-verzeichnis von mingw. wenn du in einer entwicklungsumgebung àla devc++ oder codeblocks arbeitest, dann kannst du die einfach grafisch einbinden, ansonsten musst du sie ins make-file reinfummeln.


Jep, die Linkerei hatte ich jetzt zuletzt auch schon im Verdacht - in die Makefile "-lwsock32" hinter LIBS rein und schon kompilierts - nur gehen tuts noch net *grml*

Danke Euch schon mal! Wahrscheinlich hakts jetzt an der Socketinitialisierung mit Windoof...
 
Zurück
Oben