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 4

    Der 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 4

    Steht doch da, die Funktion will int, du gibst void*, anstatt NULL einfach 0 schreiben.


Anmelden zum Antworten