72f8ba24304c4648c18e11f0aa2287f2

When I must use a client when I surf net in our school,but we, our classmates, don't it bad, so a classmate programmed a client. The code is follows below. But it is similar like to have some bug, can you find it?
Thanks very much if you can find bug and enhance it.

#include <stdio.h> 

#include <unistd.h>

#include <string.h> 

#include <arpa/inet.h> 

#include <netinet/in.h> 

#include <sys/types.h> 

#include <sys/socket.h> 

#include <sys/ioctl.h> 

#include <net/if.h> 

 

typedef struct _code2 { 

    char sign; 

    char type; 

    short len; 

    int id; 

    int code0; 

    int code1; 

}code2; 

 

typedef struct _code3 { 

    char sign; 

    char type; 

    short len; 

    int id; 

    int unk0; 

    int code1; 

    int unk1; 

    int code0; 

    int check; 

    int unk2; 

    char mac[6]; 

    char dhcp; 

    char devtype; 

    int ipaddr; 

    int netmask; 

    char padding[48]; 

}code3; 

 

int waitdata(int hsocket, int time) 

{ 

    fd_set fds; 

    struct timeval tv; 

 

    FD_ZERO(&fds); 

    FD_SET(hsocket,&fds); 

    tv.tv_usec = time; 

    tv.tv_sec = 0; 

    return select(hsocket+1,&fds,NULL,NULL,&tv); 

} 

 

 

int main (int argc, char* argv[]) 

{ 

    struct in_addr ip, netmask; 

    char mac[6]; 

    int hsocket; 

    struct ifreq ifr; 

    struct sockaddr_in sin; 

    struct sockaddr *sa = (struct sockaddr *) &sin; 

    socklen_t fromlen;

    struct sockaddr_in *sin_ptr; 

    u_char *ptr; 

    u_long *ptr_long;

    int n,workwell = 0;

    int check; 

    char c1[] = {7,1,8,0,1,0,0,0};

    struct _code2 c2;

    struct _code3 c3;  

    int sendlen, recvlen; 

 

    printf("\nFree Dr.COM for Linux  v0.1\n  MengXP Works,2009 @ xiyou\n  http://www.deadc0de.com/\n\n"); 

    if ((hsocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 

    { 

        perror( "socket error!"); 

        return 0; 

    } 

 

    strcpy(ifr.ifr_name, "ppp0"); 

    if (ioctl(hsocket, SIOCGIFADDR, &ifr) < 0) 

        perror("ioctl SIOCGIFNETMASK error"); 

    sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr; 

    ip = sin_ptr->sin_addr; 

 

    if (ioctl(hsocket, SIOCGIFNETMASK, &ifr) < 0) 

        perror("ioctl SIOCGIFNETMASK error"); 

    sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr; 

    netmask = sin_ptr->sin_addr; 



    if (ioctl(hsocket, SIOCGIFHWADDR, &ifr) < 0) 

        perror("ioctl SIOCGIFHWADDR error"); 

    memcpy(&mac,&ifr.ifr_hwaddr.sa_data[0],6); /* fix me!  00:00:00:00:00:00 for ppp0 */ 

 

    printf("net interface:\n"); 

    ptr = (u_char *)&mac; 

    printf( "MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 

            *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3), *(ptr + 4), *(ptr + 5) ); 

    printf( "Subnet Mask: %s\n", inet_ntoa(netmask)); 

    printf( "IP: %s\n", inet_ntoa(ip)); 

 

    sin.sin_addr.s_addr = INADDR_ANY; 

    sin.sin_port = htons(61440); 

    sin.sin_family = AF_INET; 

    if ((bind(hsocket,sa,sizeof(sin))) < 0) 

    { 

        printf( "can't bind port 61440!\n"); 

        return 0; 

    } 

    sin.sin_addr.s_addr = inet_addr("1.1.1.1"); 



keepalive:

    if(!workwell) 

        printf("Try to connect Dr.COM Server...\n");

    while(1) 

    { 

        sendlen = sendto(hsocket,&c1,8,0,sa,sizeof(sin));

        if(sendlen < 0)

            perror("send1 "); 

        if(waitdata(hsocket,1000*1000)) 

        { 

            fromlen = sizeof(sin); 

            recvlen = recvfrom(hsocket,&c2,sizeof(c2),0,sa,&fromlen);

            ip = sin.sin_addr;

            break; 

        } 

        else 

            printf("recv2 timed out\n"); 

    }

    

    while(1)

    {

        memset(&c3,0,96); 

        c3.sign = 7;

        c3.len = 96;

        c3.id = 3;

        c3.code1 = c2.code1;

        c3.unk1 = 0x2000200;

        c3.code0 = c2.code0;

        c3.check = 0x1312fc7;

        c3.unk2 = 0x7e;

        memcpy(&c3.mac,&mac,6);

        c3.devtype = 0x17;

        memcpy(&c3.ipaddr,&ip,4);

        memcpy(&c3.netmask,&netmask,4);

        

        ptr_long = (u_long *)&c3; 

        for(n=0,check=0;n<96/4;n++)

            check ^= *(ptr_long + n);

        c3.check = check * 0x12C4B7E;

        c3.unk2 = 0;

    

        ptr = (u_char *)&c3.mac; 

        for(n=0;n<64;n++)

	     *(ptr + n) = (*(ptr + n) >> 8 - (n & 7)) + (*(ptr + n) << (n & 7));



        

        sendlen = sendto(hsocket,&c3,96,0,sa,sizeof(sin));

        if(sendlen < 0)

            perror("send3 "); 

        if(waitdata(hsocket,1000*1000)) 

        { 

            fromlen = sizeof(sin); 

            recvlen = recvfrom(hsocket,&c2,sizeof(c2),0,sa,&fromlen);

            if(!workwell)

            {

                printf("Keeping connection active...\n"); 

                workwell = 1;

            }

            break; 

        } 

        else

        { 

            printf("recv4 timed out\n");

            sleep(1);

            goto keepalive;

        } 

    }

    sleep(15);

    goto keepalive;

    return 0; 

}

Refactorings

No refactoring yet !

Your refactoring





Format Copy from initial code

or Cancel