K
Hallo erstmal,
ich hoffe ihr könnt mir weiterhelfen. Ich sitze hier schon mehrere Stunden an einem Problem. Die sendto() funktion aus der Winsocklibary funktioniert nicht, sie meldet andauernd falscher Sockettyp, dabei ist dieser genauso definiert wie in der msdn Datenbank von Microsoft gewünscht.
Hier mein code (vereinfacht)
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include "config"
//#include <string.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define STRICMP _stricmp
#define DEFAULT_SERVER "::1"
#define DEFAULT_FAMILY PF_INET6
#define DEFAULT_SOCKTYPE SOCK_DGRAM
#define DEFAULT_Protocoll IPPROTO_UDP
#define DEFAULT_PORT "5001"
#define DEFAULT_EXTRA 0
#define BUFFER_SIZE 65536
int main()
{
char Buffer[BUFFER_SIZE], AddrName[NI_MAXHOST];
char *Server = DEFAULT_SERVER;
int Family = DEFAULT_FAMILY;
int SocketType = DEFAULT_SOCKTYPE;
char *Port = DEFAULT_PORT;
WSADATA wsaData;
int i, RetVal, AddrLen, AmountToSend;
int ExtraBytes = DEFAULT_EXTRA;
unsigned int Iteration, MaxIterations = 1;
ADDRINFO Hints, *AddrInfo, *AI;
SOCKET ConnSocket = INVALID_SOCKET;
struct sockaddr_storage Addr;
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
fprintf(stderr, "WSAStartup failed with error %d: %s\n",RetVal, PrintError(RetVal));
WSACleanup();
return -2;
}
memset(&Hints, 0, sizeof (Hints));
Hints.ai_family = Family;
Hints.ai_protocol=DEFAULT_Protocoll;
Hints.ai_socktype = SocketType;
RetVal = getaddrinfo(Server, Port, &Hints, &AddrInfo);
if (RetVal != 0) {
fprintf(stderr, "Cannot resolve address [%s] and port [%s], error %d: %s\n",Server, Port, RetVal, gai_strerror(RetVal));
WSACleanup();
return -31;
}
AI = AddrInfo;
ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol);
printf("socket call with family: %d socktype: %d, protocol: %d\n", AI->ai_family, AI->ai_socktype, AI->ai_protocol);
if (ConnSocket == INVALID_SOCKET) printf("socket call failed with %d\n", WSAGetLastError());
if (ConnSocket == INVALID_SOCKET) fprintf(stderr, "Error Opening socket, error %d: %s\n", WSAGetLastError(), PrintError(WSAGetLastError()));
if (AI == NULL) {
fprintf(stderr, "Fatal error: unable to connect to the server.\n");
WSACleanup();
return -41;
}
if (AI->ai_socktype == SOCK_DGRAM){
strcpy(Buffer,"test");
i=sendto(ConnSocket,Buffer,sizeof(Buffer),0,(SOCKADDR *) &AddrInfo,sizeof(ADDRINFO));
printf("%d",(WSAGetLastError()));
getchar();
}
shutdown(ConnSocket, SD_SEND);
closesocket(ConnSocket);
WSACleanup();
return 0;
}
Die Ausgabe ist immer WSAfehlercode 10047 was lt der msdn libary bedeutet:
WSAEAFNOSUPPORT
10047
Address family not supported by protocol family.
Es wurde eine mit dem angeforderten Protokoll nicht kompatible Adresse verwendet. Alle Sockets werden mit einer zugeordneten Adressfamilie (d. h. AF_INET für Internetprotokolle) und einem allgemeinen Protokolltyp (d. h. SOCK_STREAM) erstellt. Dieser Fehler wird zurückgegeben, wenn im socket-Aufruf explizit ein falsches Protokoll angefordert wird, oder wenn eine Adresse der falschen Familie z. B. in sendto für einen Socket verwendet wird.
Vielen dank schonmal im vorhinein.