Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[winsock] Pierwsze kroki i kicha : error C2065: 'stderr' : undeclared identifier error C3861: 'fprintf': identifier not found

Ostatnio zmodyfikowano 2025-06-04 00:32
Autor Wiadomość
tookie009
Temat założony przez niniejszego użytkownika
[winsock] Pierwsze kroki i kicha : error C2065: 'stderr' : undeclared identifier error C3861: 'fprintf': identifier not found
» 2013-02-22 20:24:40
Witajcie, właśnie chciałem zacząć się uczyć Winsocka, ale już przy samej konfiguracji mam problemy. Otóż wyskakuje mi problem taki jak w temacie:
error C2065: 'stderr' : undeclared identifier  error C3861: 'fprintf': identifier not found

Próbowałem linkować zarówno wsock32.lib jak i winsock32.lib. Niestety bez efektów. Z góry dziękuje za pomoc.
P-76739
DejaVu
» 2013-02-22 23:29:33
To nie jest kwestia linkera, tylko kwestia odpowiedniego includa.
C/C++
#include <cstdio>
P-76759
tookie009
Temat założony przez niniejszego użytkownika
» 2013-02-24 20:34:38
ok, dziekuję, ale znowu mam problem. mój kod:

C/C++
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <string>

#pragma comment(lib, "ws2_32.lib")

#include <winsock.h>

int main()
{
    WSADATA wsaData; // jeśli to nie zadziała
    //WSAData wsaData; // użyj tego
   
    if( WSAStartup( MAKEWORD( 1, 1 ), & wsaData ) != 0 )
    {
        fprintf( stderr, "WSAStartup failed.\n" );
        exit( 1 );
    }
   
    struct sockaddr {
        unsigned short sa_family; // rodzina adresów, AF_xxx
        char sa_data[ 14 ]; // 14-bajtowy adres protokołowy
    };
   
    struct sockaddr_in {
        short int sin_family; // rodzina adresów
        unsigned short int sin_port; // numer portu
        struct in_addr sin_addr; // adres internetowy
        unsigned char sin_zero[ 8 ]; // dla zachowania rozmiaru struct sockaddr
    };
   
    struct sockaddr_in my_addr;
   
    my_addr.sin_family = AF_INET; // host byte order
    my_addr.sin_port = htons( MYPORT ); // short, network byte order
    inet_aton( "10.12.110.57", &( my_addr.sin_addr ) );
    memset( &( my_addr.sin_zero ), '\0', 8 ); // wyzeruj resztę struktury
   
   
    //Tu dalsza część programu
    return 0;
}

A więc jak widzicie, próbowałem tylko skopiować kod z kursu winsocka.
Otrzymuje nastepujące błędy
1>c:\users\zzz\desktop\sock\sock\s.cpp(44): error C2065: 'MYPORT' : undeclared identifier
1>c:\users\zzz\desktop\sock\sock\s.cpp(45): error C2660: 'inet_addr' : function does not take 2 arguments

zamiast inet_atom próbowałem użyć też  inet_addr(), ale ta funkcja nie korzysta z dwóch argumentów...

Patrzyłem też na inne kursy dostępne w sieci i w ogóle nie mogę wystartować, żeby coś faktycznie zaczęło wychodzić. Próbowałem też z jednego tematu z winapi - tam też był temat o winsock - coś robić, ale tam z kolei jest wersja 2.2.
I niestety, że tak wszystko to na niczym spełza, troszeczkę się nie zniechęcam. Do tej pory zrobiłem całe kursy podstawowe, i kurs allegro. To było przed około 2 laty. Teraz zacząłem WINapi, ale zauważyłem, że w gruncie rzeczy potrzebuję do mojego projektu winsocka, dlatego chciałem to okiełznać. Z takim podstawami jest sens dalej próbować ?

PS.
Moje środowisko to MS Visual Studio 2010
P-76911
pekfos
» 2013-02-24 20:46:36
Chyba jeszcze nie skopiowałeś wszystkich kawałków kodu z kursu ;)
P-76913
termistor
» 2025-06-04 00:32:58
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.
P-182479
« 1 »
  Strona 1 z 1