Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Слепить(все готовое) клиент, сервер и crc???!!! (http://forum.oszone.net/showthread.php?t=236344)

Killer_13 09-06-2012 17:04 1931323

Слепить(все готовое) клиент, сервер и crc???!!!
 
Здравствуйте, такая вот досада, с бухты барахты нужно сделать вот такую вот программу. Как то проверять на ошибки сообщение к серверу, я же давным давно на "С" ничего не делал. И куча констант и так д.. половину синтаксиса не понятно.

В общем прошу помощи! Весь код имеется, нужно только чуток допилить.

Нужно проверить сообщение которое отсылается на сервер с помощью CRC-суммы. Если не сходится crc, то отсылать заново.

Сервер.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    //if (argc < 2) {
    //    fprintf(stderr,"ERROR, no port provided\n");
    //    exit(1);
    //}
   
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    bzero((char *) &serv_addr, sizeof(serv_addr));

    // set SO_REUSEADDR on a socket to true (1):
        int optval = 1;
        setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);

    //portno = atoi(argv[1]);
    portno = 3334;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
    if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0)
              error("ERROR on binding");
    listen(sockfd,5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd,
                (struct sockaddr *) &cli_addr,
                &clilen);
    if (newsockfd < 0)
          error("ERROR on accept");
    bzero(buffer,256);
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
    printf("Here is the message: %s\n",buffer);
    n = write(newsockfd,"I got your message",18);
    if (n < 0) error("ERROR writing to socket");
    close(newsockfd);
    close(sockfd);
    return 0;
}

Клиент
Код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    //if (argc < 3) {
    //  fprintf(stderr,"usage %s hostname port\n", argv[0]);
    //  exit(0);
    //}
    portno = 3334;        //atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    //server = gethostbyname(argv[1]);
    server = gethostbyname("127.0.0.1");
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
        (char *)&serv_addr.sin_addr.s_addr,
        server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0)
        error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0)
        error("ERROR reading from socket");
    printf("%s\n",buffer);
    close(sockfd);
    return 0;
}

CRC
Код:

#include <stdio.h>
long int ll = 0;

unsigned int hackers_delight_crc32(unsigned char *message)
{
        int i, j;
        unsigned int byte, crc, mask;
        i = 0;
        crc = 0xFFFFFFFF;
        while (message[i] != 0) {
                byte = message[i]; // Get next byte.
                crc = crc ^ byte;
                for (j = 7; j >= 0; j--) { // Do eight times.
                        mask = -(int)(crc & 1);
                        crc = (crc >> 1) ^ (0xEDB88320 & mask);
                }
                i = i + 1;
        }
        return ~crc;
}

int main()
{
        unsigned char message[] = "0123456789";
        unsigned int crc;
        // gives 0xcbf43926
        // this matches http://www.zorc.breitbandkatze.de/crc.html

        unsigned int original_crc = hackers_delight_crc32(message);
        printf( "original message: %s crc=0x%08X\n", message, original_crc );

        // Finden wir eine zweite Nachricht mit demselben CRC ?
        // Nein, ist schwer zu ifnedn, aber nicht unmöglich
        for( unsigned char c = 'A'; c<='Z'; c++ )
        {
                for( unsigned char d = 'A'; d<='Z'; d++ )
                {
                        for( unsigned char e = 'A'; e<='Z'; e++ )
                        {
                                for( unsigned char f = 'A'; f<='Z'; f++ )
                                {
                                        for( unsigned char g = 'A'; g<='Z'; g++ )
                                        {
                                                message[3] = c;
                                                message[5] = d;
                                                message[7] = e;
                                                message[8] = f;
                                                message[9] = g;
                                                crc = hackers_delight_crc32(message);
                                                ll++;
                                                if( crc == original_crc )
                                                {
                                                        printf( "message: %s crc=0x%08X\n", message, crc );
                                                        printf("DUPLICATE MESSAGE FOUND WITH SAME CRC\n");
                                                }
                                        }
                                }
                        }
                }
        }
        printf( "attempts: %ld \n", ll );
}

Спасибо огромное!


Время: 18:54.

Время: 18:54.
© OSzone.net 2001-