Socketprogrammierung
-
Hallo,
ich erlerne gerade Socketprogrammierung in C und habe ein Problem mit der sendto()-Methode.
Weshalb kann ich es nicht so schreiben? Wieso funktioniert das nicht?
/***/
/*** Schreibe in das Socket die Anfrage req /
//
s = sendto(s,req,sizeof(*req),NULL,(struct sockaddr*)&remote,sizeof(remote));Da bekomme ich die Warnungen:
warning C4133: 'function' : incompatible types - from 'request *' to 'const char *'
warning C4047: 'function' : 'int' differs in levels of indirection from 'void *'
warning C4024: 'sendto' : different types for formal and actual parameter 4Der Zusammenhang:
#include <stdio.h> #include <string.h> #include <errno.h> #include "..\data.h" #include "..\error.c" #include <winsock2.h> static struct answer answ; extern int errno; /***********************************/ /*** Definiere Portnummer "2000" ***/ /***********************************/ #define Server_Port 2000 /************************************************/ /*** Deklariere Socketdeskriptor "s" statisch ***/ /************************************************/ static int s; /******************************************************/ /*** Deklariere die Socketadresse "remote" statisch ***/ /******************************************************/ static struct sockaddr_in remote; void test(int retval,char *text) { if (retval < 0) { perror(text); exit(1); }; }; /* test */ void initClient(char *name) { struct hostent *hostptr; WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD(2,1); if( WSAStartup( wVersionRequested,&wsaData ) == SOCKET_ERROR ){ printf("CLIENT: WSAStartup() failed!\n"); printf(" error code: %d\n",WSAGetLastError()); exit(-1); } /* Create an endpoint for communication */ /***************************************/ /*** Initialisiere die Adressfamilie ***/ /***************************************/ remote.sin_family = AF_INET; /************************************/ /*** Initialisiere die Portnummer ***/ /************************************/ remote.sin_port = htons(Server_Port); /* Initialisieren der Adresse */ if (name != 0 ) { /* Es wurde ein Name eingegeben */ /*****************************************************/ /*** Ueberpruefe ob der Name einer Internetadresse ***/ /*** zugeordnet werden kann ***/ /*****************************************************/ { if ( (hostptr = gethostbyname(name)) != 0) { /* Hostname gefunden */ /********************************************************/ /*** Initialisiere mit den Namen des entfernten Hosts ***/ /********************************************************/ remote.sin_addr.s_addr=*(unsigned long*)(gethostbyname(name)->h_addr ); } else { /* Hostname nicht gefunden */ printf ("Error: Illegal name \n"); exit(-1); }; }; } else { /* Es wurde kein Name eingegeben -> lokale Socketverbindung */ /**************************************************/ /*** Kennzeichne die Socketverbindung als lokal ***/ /**************************************************/ remote.sin_addr.s_addr = inet_addr("127.0.0.1"); //s_addr evtl falsch }; }; /* initClient */ struct answer *DoRequest(struct request *req) { int timeout; int retlen; int recvcc; int fromlen; /* Send a message from a socket */ /**********************************************************/ /*** Erzeuge Socket mit Internet-Adressformat, ***/ /*** verbindungsloser Dienst und mit Internet-Protokoll ***/ /**********************************************************/ s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); /**********************************************/ /*** Schreibe in das Socket die Anfrage req ***/ /**********************************************/ s = sendto(s,req,sizeof(*req),NULL,(struct sockaddr*)&remote,sizeof(remote)); /* Receive a message from a socket */ while (1) { /****************************************************************/ /*** Lese die Antwort vom Socket und speichere sie in answ ab ***/ /****************************************************************/ recvcc = recvfrom(s,&answ,sizeof(answ),NULL,(struct sockaddr*)&remote, &fromlen); if (recvcc == -1) { printf ("error recvfrom"); return(0); }; break; } /* Delete a descriptor */ /************************/ /*** Schliesse Socket ***/ /************************/ close(s); return(&answ); }; void closeClient(){ if (WSACleanup()==SOCKET_ERROR){ printf("CLIENT: WSACleanup() failed!\n"); printf(" error code: %d\n",WSAGetLastError()); exit(-1); } }
-
Bengel1 schrieb:
warning C4133: 'function' : incompatible types - from 'request *' to 'const char *'
Steht doch da, die Funktion will const char*, du gibst request*, einfach casten.
Bengel1 schrieb:
warning C4047: 'function' : 'int' differs in levels of indirection from 'void *'
warning C4024: 'sendto' : different types for formal and actual parameter 4Steht doch da, die Funktion will int, du gibst void*, anstatt NULL einfach 0 schreiben.