termistor Witam, analizując Twój kod i błędy, można zauważyć kilka kluczowych problemów:
1. **Brak definicji `MYPORT`**
W linii `htons(MYPORT)` używasz makra `MYPORT`, które nie zostało zdefiniowane. Dodaj na początku pliku:
#define MYPORT 8080
(lub inna port, np. 1234). Makra muszą być zdefiniowane przed użyciem.
2. **Błędne użycie `inet_aton`**
W systemie Windows funkcja `inet_aton` nie istnieje. W Winsock korzysta się z `inet_addr`, który przyjmuje **jeden** argument (string z adresem IP). Popraw linijkę:
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
Usuń całkowicie `inet_aton`, ponieważ nie działa w Winsock.
3. **Zduplikowane definicje struktur**
Kod zawiera deklaracje `sockaddr` i `sockaddr_in`, które są już zdefiniowane w `<winsock2.h>`. Usuń te fragmenty:
// Usuń cały blok z definicjami sockaddr i sockaddr_in
Wystarczy korzystać z typów dostarczanych przez bibliotekę.
4. **Konflikt nagłówków**
Występuje zawieszenie z wersjami Winsock:
- Usuń `#include <winsock.h>` (jest to starsza wersja, konfliktuje z `<winsock2.h>`).
- Upewnij się, że `<winsock2.h>` jest pierwszy w liście `#include`. Przykładowo:
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
// ...
5. **Wersja Winsocka**
W `WSAStartup` używasz `MAKEWORD(1,1)`, co odpowiada Winsock 1.1. Jeśli korzystasz z Visual Studio 2010, lepiej użyć wersji 2.2:
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { ... }
Winsock 2.2 oferuje większe możliwości i lepszą kompatybilność.
---
**Poprawiony fragment kodu (fragment z uwzględnieniem powyższych zmian):**
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#define MYPORT 8080
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(my_addr.sin_zero, '\0', 8);
return 0;
}
---
**Dodatkowe wskazówki:**
- Upewnij się, że kompilujesz projekt w trybie **Unicode** (lub przełącz na ANSI, jeśli kurs zakłada to).
- W Visual Studio 2010 niektóre funkcje Winsocka mogą wymagać dodatkowych flag kompilatora (np. `_WIN32_WINNT`), ale w podstawowym przykładzie nie są potrzebne.
- Jeśli nadal występują problemy, sprawdź, czy biblioteka `ws2_32.lib` jest poprawnie dołączone do projektu (przez `#pragma comment` lub ustawienia projektu).
Pamiętaj, że Winsock 2.2 jest stabilny i dobrze udokumentowany — warto skupić się na przykładach z oficjalnych dokumentów Microsoft (np. MSDN). Jeśli masz więcej pytań, śmiało pytaj.