Jsem zoufaly, neidentifikovatelna chyba v programu v C

Luboš Mikulec mikulec na dszo.cz
Čtvrtek Květen 25 07:12:46 CEST 2000


Hi All !

Nasledujici program ma za ulohu poslat pomoci UDP protokolu na urcity port
nekolik desitek byte a pockat 3 sekundy na odpoved.

Problem je v tom, ze staci prehodit poradi v deklaraci promennych a pak
nefunguje korektne, napr. neprobehne BIND(), nebo SENDTO(),
nebo v RECFROM naplni strukturu RECV nesmyslnimu udajmi. Pokud to zkompiluji
jaku dynamicku knihovnu k PHP, sice pracuje, ale v Apache
logu hlasi Segmentation fault. Program je defacto dle prikladu v LIBC, zadne
ukazatele, nic nealokuji, ale i tak neco prepisuje.

Poradte prosim.

S pozdravem : Mikulec Lubos.

-----cut-----

void main(void)
{ 

    unsigned char reply[512];
    unsigned char message[512];

    int message_len=10;
    int bytes;
    int sock;

    struct sockaddr_in sin_server,sin_client; 
    struct sockaddr_in sin_recv; 

    size_t size_server,size_client;
    size_t size_recv;

    fd_set rfds;
    struct timeval tv;
    int retval;

    sin_client.sin_addr.s_addr = htonl(INADDR_ANY); 
    sin_client.sin_family = AF_INET; 
    sin_client.sin_port = htons(0); 
    size_client=sizeof(sin_client);

    sin_server.sin_addr.s_addr = inet_addr("192.168.1.1"); 
    sin_server.sin_family = AF_INET; 
    sin_server.sin_port = htons(8888);
    size_server=sizeof(sin_server);

    sin_recv.sin_family = AF_INET;
    size_recv=sizeof(sin_recv);

    sock = socket(PF_INET,SOCK_DGRAM,0); 

    if(sock<0)
    { 
        printf("Couldn't get a socket\n"); 
        exit(1);    
    } 
 
    if( bind( sock, (struct sockaddr*) &sin_client, size_client )  < 0 ) 
    { 
        printf("Bind failed\n"); 
        close (sock);
        exit(1);    
    } 

    bytes = sendto(sock, message, message_len,0, (struct sockaddr*) & sin_server, size_server); 
    if (bytes < 0) 
    { 
        printf("sendto failed\n"); 
        close (sock);
        exit(1);    
    } 

    FD_ZERO(&rfds);
    FD_SET(sock,&rfds);
    
    tv.tv_sec=3;
    tv.tv_usec=0;
    
    retval=select(sock+1,&rf
ds,NULL,NULL,&tv);

    if (retval)
    {
         bytes = recvfrom(sock, reply, 512, 0, (struct sockaddr*)
&sin_recv,&size_recv);

    if (bytes < 0)


        printf("recv() failed");
        close(sock);
        exit(1);
    }

    if (bytes == 0)


        printf("Server closed connection\n");
        close(sock);
        exit(1);
    }

        reply[bytes]=0;
    }
    else
    {
        printf("Zadna odpoved !\n");
        close(sock);
        exit(1);
    }

    close(sock);
}





Další informace o konferenci Linux