Cześć, dlaczego kompilator mówi mi, że redefiniuję między innymi strukturę sockaddr skoro normalnie używam jej w innej strukturze tak jak w przykładzie. Co robię nie tak, bo wszystko wydaje mi się tutaj poprawne.
Kod:
/*
Initialise Winsock
*/
#include<stdio.h>
#include <stdint.h>
#include<winsock2.h>
struct addrinfo {
int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc.
int ai_family; // AF_INET, AF_INET6, AF_UNSPEC
int ai_socktype; // SOCK_STREAM, SOCK_DGRAM
int ai_protocol; // use 0 for "any"
size_t ai_addrlen; // size of ai_addr in bytes
struct sockaddr *ai_addr; // struct sockaddr_in or _in6
char *ai_canonname; // full canonical hostname
struct addrinfo *ai_next; // linked list, next node
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
struct in_addr {
uint32_t s_addr; // that's a 32-bit int (4 bytes)
};
struct sockaddr_in6 {
uint16_t sin6_family; // address family, AF_INET6
uint16_t sin6_port; // port number, Network Byte Order
uint32_t sin6_flowinfo; // IPv6 flow information
struct in6_addr sin6_addr; // IPv6 address
uint32_t sin6_scope_id; // Scope ID
};
struct in6_addr {
unsigned char s6_addr[16]; // IPv6 address
};
struct sockaddr_storage {
sa_family_t ss_family; // address family
// all this is padding, implementation specific, ignore it:
char __ss_pad1[_SS_PAD1SIZE];
int64_t __ss_align;
char __ss_pad2[_SS_PAD2SIZE];
};
int main(int argc , char *argv[])
{
WSADATA wsa;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}
printf("Initialised.");
return 0;
}
Błąd:
||=== Build: Release in basicSocket (compiler: GNU GCC Compiler) ===|
D:\Networking in C\basicSocket\main.c|21|error: redefinition of 'struct sockaddr'|
D:\Program Files\CodeBlocks\MinGW\x86_64-w64-mingw32\include\psdk_inc\_ip_types.h|70|note: originally defined here|
D:\Networking in C\basicSocket\main.c|26|error: redefinition of 'struct sockaddr_in'|
D:\Program Files\CodeBlocks\MinGW\x86_64-w64-mingw32\include\psdk_inc\_ip_types.h|75|note: originally defined here|
D:\Networking in C\basicSocket\main.c|33|error: redefinition of 'struct in_addr'|
D:\Program Files\CodeBlocks\MinGW\x86_64-w64-mingw32\include\inaddr.h|17|note: originally defined here|
D:\Networking in C\basicSocket\main.c|34|error: expected ':', ',', ';', '}' or '__attribute__' before '.' token|
D:\Networking in C\basicSocket\main.c|41|error: field 'sin6_addr' has incomplete type|
D:\Networking in C\basicSocket\main.c|49|error: redefinition of 'struct sockaddr_storage'|
D:\Program Files\CodeBlocks\MinGW\x86_64-w64-mingw32\include\winsock2.h|260|note: originally defined here|
D:\Networking in C\basicSocket\main.c|50|error: unknown type name 'sa_family_t'|
||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|