PDA

Показать полную графическую версию : Слепить(все готовое) клиент, сервер и crc???!!!


Killer_13
09-06-2012, 17:04
Здравствуйте, такая вот досада, с бухты барахты нужно сделать вот такую вот программу. Как то проверять на ошибки сообщение к серверу, я же давным давно на "С" ничего не делал. И куча констант и так д.. половину синтаксиса не понятно.

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

Нужно проверить сообщение которое отсылается на сервер с помощью 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 );
}

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




© OSzone.net 2001-2012