?
Da ich der Ansicht bin, vorgekautes Essen schmeckt am Besten, hier mein Lösungsansatz.
Um den Server zu finden, ohne manuell suchen zu müssen, musst du Gebrauch vom User Datagram Protocol machen (UDP). Das ist ein Verbindungsloses Protokoll, bei dem Daten auch ins "Nichts" geschickt werden können.
Dazu musst dein Server über UDP (beispielsweise jede Sekunde) einen Broadcast absenden. Das funktioniert wie folgt (der gute, alte Quick-And-Dirty-Weg):
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
char broadcast = '1';
setsockopt(g_UdpSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(char));
struct sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(struct sockaddr_in));
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = INADDR_BROADCAST;
sockAddr.sin_port = htons(DEIN_LIEBLINGS_PORT);
Der Code bewirkt folgendes: Es wird ein UDP Socket erstellt und für ihn das SO_BROADCAST Feature aktiviert. Damit darf er über INADDR_BROADCAST (255.255.255.255) Daten versenden.
Dann kannst du mit sendto eine Dummy Nachricht versenden. In der Nachricht kann irgendein Sch*** stehen, hauptsache, sie wird versenden:
char data[256];
sendto(sock, data, sizeof(char[256]), 0, (struct sockaddr*) &sockAddr, sizeof(struct sockaddr_in));
Dein Client muss jetzt einen UDP Listener implementieren. Das funktioniert in etwa so:
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(struct sockaddr_in));
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = INADDR_ANY;
sockAddr.sin_port = htons(DEIN_LIEBLINGS_PORT);
bind(sock, (sockaddr*) &sockAddr, sizeof(struct sockaddr_in));
Und, damit du überhaupt Daten empfangen kannst, muss du (idealerweise in einem Thread) alle eingehenden Daten, die über deinen Lieblingsport laufen, "abholen".
DWORD WINAPI ReceiveThread(void* unused) {
while (true) {
struct sockaddr_in remote;
int remoteLen = sizeof(struct sockaddr_in);
int bytesReceived;
char buffer[256];
bytesReceived = recvfrom(sock, buffer, WAVE_BUFFER_SIZE, 0, (struct sockaddr*) &remote, &remoteLen);
if (bytesReceived > 0) {
char* address = inet_ntoa(remote.sin_addr);
}
}
return 0;
}
[code="cpp"]
Und im Handumdrehen kannst du aus remote die Ip Adresse auslesen.
Im Anschluss kannst du dann zum Beispiel TcpStartup(address) (oder wie auch immer du sie genannt hast) aufrufen (die du, deiner Aussage nach, ja bereits implementiert hast) und schwuppdiwupp verbindet sich dein Client automatisch mit dem Server und kann Nachrichten an ihn versenden.