Bekomme Fehlermedlung wegen socket



  • HI,
    tolles Forum. Echt.

    Bekomme folgende Fehlermeldung, bei Übung aus dem Buch:


    server got connection from 32.157.127.183 prot 1032
    accepting connection: Socket operation on non-socket

    Kann auch nicht mit telnet oder so connecten... villt kann ja wer helfen 🙂

    server.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include "hacking.h"
    
    #define PORT 7790
    
    int
    main(void)
    {
    
    int sockfd, new_sockfd;
    struct sockaddr_in host_addr, client_addr;
    int recv_length=1, yes=1;
    socklen_t sin_size;
    char buffer[1024];
    
    if((sockfd=(PF_INET, SOCK_STREAM, 0))==-1)
    perror("in socket");
    
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))==-1)
    perror("in setting options");
    
    host_addr.sin_family = AF_INET;
    host_addr.sin_port = htons(PORT);
    host_addr.sin_addr.s_addr = 0;
    memset(&(host_addr.sin_zero), '0', 8);
    
    if(bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr))==-1)
    perror("in binding");
    
    if(listen(sockfd, 5)==-1)
    perror("in listening on socket");
    
    while(1){
    
    sin_size = sizeof(struct sockaddr_in);
    new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
    if(new_sockfd == -1)
    perror("accepting connection");
    
    printf("server got connection from %s prot %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    
    send(new_sockfd, "Hello, world!\n", 13,0);
    recv_length = recv(new_sockfd,&buffer,1024,0);
    
    while (recv_length > 0) {
    	printf( "RECV: %d bytes\n", recv_length );
    	dump(buffer, recv_length);
    	recv_length = recv(new_sockfd, &buffer, 1024, 0);
    
    }
    close(new_sockfd);
    }
    return 0;
    }
    

    hacking.h

    void dump(const unsigned char *data_buffer, const unsigned int length) {
    	unsigned char byte;
    	unsigned int i,j;
    	for ( i = 0; i < length; i++) 
            {
    		byte = data_buffer[i];
    		printf( "%02x ", data_buffer[i]);
    		if(((i%16)==15) || (i == length-1)) {
    
    		for (  j = 0; j < length; j++) 
                    printf ("	");
    		printf( "|  " );
    		for ( j =(i-(i%16)); j <= i; j++) 
                    {
                    	byte = data_buffer[j];
    			if((byte > 31) && (byte < 127))
    			printf( "%c", byte );
    			else
    				printf( "." );
    
                    }
    		printf( "\n" );
    }
    }
    }
    

    mfg theone



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bei Zeile 21 fehlt das socket()
    Bei Ziele 34 muss es heißen sizeof(struct sockaddr_in)
    + das was ich nicht gesehen habe.

    Kompilier das nächste mal mit Warnungen:

    test.c: In function ‘main’:
    test.c:46: warning: left-hand operand of comma expression has no effect
    test.c:46: warning: left-hand operand of comma expression has no effect
    test.c:79: warning: pointer targets in passing argument 1 of ‘dump’ differ in signedness
    test.c:7: note: expected ‘const unsigned char *’ but argument is of type ‘char *’
    test.c:83: warning: implicit declaration of function ‘close’

    Achtung, Zeilennummern verschoben da hacking.h mit Copy & Paste eingefügt.



  • Oh, okay danke - war verschlafen, dass mit socket() fehlte 😕

    Aber hier, wegen dem anderen da:

    sockaddr-Struktur(Generische Struktur)
    <--------><----------------------------------------------->
    |Fam|ilie|  |  |  |  |  |   |sa_ |data  |  |  |  |  |  |  |
    
    sockaddr_in-Struktur(für IP Version 4)
    <--------><---><------------><---------------------------->
    |Fam|ilie|Po|nr|  |IP|Ad|   |8Fül|lbytes|  |  |  |  |  |  |
              rt .        r.
    

    mfg

    Ps: Hatte viel Arbeit heute, bin verschlafen 😕



  • Meine man-page sagt zu bind() folgendes:

    int bind(int sockfd, const struct sockaddr *addr,
    socklen_t addrlen);

    [..]

    addrlen specifies the size, in bytes, of the
    address structure pointed to by addr

    [..]

    gruß


Anmelden zum Antworten