Jsem zoufaly, neidentifikovatelna chyba v programu v C - doplneno
Luboš Mikulec
mikulec na dszo.cz
Čtvrtek Květen 25 07:17:21 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.
Kompilovana na PC s procesorem Intel Pentium s OS RedHat 6.1, prekladacem
egcs-2.91.66 a knihovnou glibc-2.1.2-11
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