Эксперт
Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011
Репутация: 10 Всего: 45
|
Цитата(nullpoint @ 2.8.2014, 13:16 ) | Можете показать как это реализовать без записи в БД? |
Гм. Я не работаю с QtCreator, поэтому тупые BSD сокеты. Цитата(nullpoint @ 2.8.2014, 13:16 ) | Т.е. сгенерировали ключ, отобразили его на экран в ASCII, приняли от клиента сообщение, посмотрели по базе идентификатор, отправили клиенту сообщение или вывели сообщение об ошибке, если нет такого идентификатора. |
Только сетевой обмен, остальное сами КлиентКод | #include <stdio.h>
#define PORT 20000
int readData( int socket, unsigned char *buf, int len) { int length = 0, i;
while( length < len ) { int n = recv( socket, &buf[length], len-length, 0); if( n == 0 ) // соединение закрыто { printf( " *** Connection closed by client\n" ); return 0; } if( n < 0 ) // произошла ошибка { printf( " *** Recv error\n" ); return -1; } length += n; }
printf( " *** Got data(%d):", length); for( i = 0; i < length; i++) printf( "%s%02x", (i == 0) ? " " : ".", buf[i]); printf( "\n" );
return length; }
void doAction( int s ) { unsigned char query[5], message[15];
query[0] = 0x45u; query[1] = 'A'; query[2] = 'B'; query[3] = 'C'; query[4] = '\0';
if( send( s, query, 5, 0) < 0 ) { printf( "Can't send query\n" ); return; }
if( readData( s, message, 15) <= 0 ) return;
printf( "OK\n" ); }
int client( void ) { struct sockaddr_in addr; int s;
if( (s = socket( AF_INET, SOCK_STREAM, 0)) < 0 ) { printf( "Can't open client socket\n" ); return -1; }
memset( &addr, '\0', sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl( INADDR_LOOPBACK ); addr.sin_port = htons( PORT ); if( connect( s, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) { printf( "Can't connect client socket\n" ); close( s ); }
doAction( s );
close( s ); return 0; }
|
СерверКод | #include <stdio.h>
#define PORT 20000
int readData( int socket, unsigned char *buf, int len) { int length = 0, i;
while( length < len ) { int n = recv( socket, &buf[length], len-length, 0); if( n == 0 ) // соединение закрыто { printf( " *** Connection closed by client\n" ); return 0; } if( n < 0 ) // произошла ошибка { printf( " *** Recv error\n" ); return -1; } length += n; }
printf( " *** Got data:" ); for( i = 0; i < length; i++) printf( "%s%02x", (i == 0) ? " " : ".", buf[i]); printf( "\n" );
return length; }
void doAction( int s, struct sockaddr_in *sa) { unsigned int ip = ntohl( sa->sin_addr.s_addr ); unsigned int port = ntohs( sa->sin_port ); unsigned char query[5]; int len;
printf( "Got connection from %.2u.%.2u.%.2u.%.2u:%u\n", (ip >> 24) & 0xffu, (ip >> 16) & 0xffu, (ip >> 8) & 0xffu, ip & 0xffu, port);
if( (len = readData( s, query, 5)) <= 0 ) { close( s ); return; }
if( query[4] != '\0' ) { printf( "Invalid client data\n" ); close( s ); return; }
printf( " >>> Command = %x\n", query[0]); printf( " >>> Client id = %s\n", &query[1]);
if( query[0] == 0x45u ) { unsigned char message[15]; message[0] = 0x45u; message[1] = 0x42u; message[2] = query[1]; message[3] = query[2]; message[4] = query[3]; message[5] = '\0'; message[6] = 1; message[7] = 2; message[8] = 3; message[9] = 4; message[10] = 5; message[11] = 6; message[12] = 7; message[13] = 8; message[14] = 9; if( send( s, message, 15, 0) < 0 ) printf( " --- Error of send\n" ); else { unsigned char data[1]; shutdown( s, SD_SEND); // ждем подтверждения от клиента, что ответ принят if( readData( s, data, 1) < 0 ) { // client error; } } }
close( s ); }
int server( void ) { struct sockaddr_in addr; int ss;
if( (ss = socket( AF_INET, SOCK_STREAM, 0)) < 0 ) { printf( "Can't open server socket\n" ); return -1; }
memset( &addr, '\0', sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl( INADDR_ANY ); addr.sin_port = htons( PORT ); if( bind( ss, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) { printf( "Can't bind server socket\n" ); close( ss ); return -1; }
if( listen( ss, 5) < 0 ) { printf( "Can't listen server socket\n" ); close( ss ); return -1; }
for( ;; ) { int alen = sizeof(addr); int s = accept( ss, (struct sockaddr *) &addr, &alen);
if( s < 0 ) { printf( "Can't connect server socket\n" ); close( ss ); return -1; }
doAction( s, &addr); }
return 0; }
|
--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
|