Привет всем < 3
Хочу получить список серверов < 3 После моего запроса к серверу, я получил приличный набор символов.
Нашел этот код на С:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #ifdef WIN32 #include <winsock.h> #include "winerr.h" #define close closesocket #define sleep Sleep #define ONESEC 1000 #else #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netdb.h> #define ONESEC 1 #endif #define VER "0.1" #define BUFFSZ 4096 #define MS "master.quake3arena.com" #define MSPORT 27950 #define REQ "\xff\xff\xff\xff" \ "getservers 68\n" #define TIMEOUT 5 int timeout(int sock); u_int resolv(char *host); void std_err(void); int main(int argc, char *argv[]) { struct sockaddr_in peer; int sd, err, rlen, i, tot = 0; u_char *buff, *ptr; u_int ip; u_short port; #ifdef WIN32 WSADATA wsadata; WSAStartup(MAKEWORD(2,0), &wsadata); #endif FILE *file; file = fopen("input.txt","w"); setbuf(stdout, NULL); peer.sin_addr.s_addr = resolv(MS); peer.sin_port = htons(MSPORT); peer.sin_family = AF_INET; rlen = sizeof(peer); buff = malloc(BUFFSZ + 1); if(!buff) std_err(); sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sd < 0) std_err(); err = sendto(sd, REQ, sizeof(REQ) - 1, 0, (struct sockaddr *)&peer, rlen); if(err < 0) std_err(); while(1) { err = timeout(sd); if(err < 0) break; err = recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &rlen); if(err < 0) std_err(); if(!err) break; if(memcmp(buff + 4, "getserversResponse", 18)) break; i = 23; /* 4 (ffffffff) + 18 (get..) + 1 (\) */ ptr = buff + 23; while(i < err) { if(!memcmp(ptr, "EOT", 3)) break; ip = *(u_int *)ptr; port = *(u_short *)(ptr + 4); printf("%15s %hu\n", inet_ntoa(*(struct in_addr *)&ip), htons(port)); ptr += 7; i += 7; tot++; fprintf(file,"%15s %hu\n", inet_ntoa(*(struct in_addr *)&ip), htons(port)); } } fclose(file); /*done!*/ close(sd); printf("\nTotal servers found: %d\n\n", tot); return(0); } int timeout(int sock) { struct timeval tout; fd_set fd_read; int err; tout.tv_sec = TIMEOUT; tout.tv_usec = 0; FD_ZERO(&fd_read); FD_SET(sock, &fd_read); err = select(sock + 1, &fd_read, NULL, NULL, &tout); if(err < 0) std_err(); if(!err) return(-1); return(0); } u_int resolv(char *host) { struct hostent *hp; u_int host_ip; host_ip = inet_addr(host); if(host_ip == INADDR_NONE) { hp = gethostbyname(host); if(!hp) { printf("\nError: Unable to resolv hostname (%s)\n", host); exit(1); } else host_ip = *(u_int *)(hp->h_addr); } return(host_ip); } #ifndef WIN32 void std_err(void) { perror("\nError"); exit(1); } #endif
Меня интересует этот момент:
while(1) { err = timeout(sd); if(err < 0) break; err = recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &rlen); if(err < 0) std_err(); if(!err) break; if(memcmp(buff + 4, "getserversResponse", 18)) break; i = 23; /* 4 (ffffffff) + 18 (get..) + 1 (\) */ ptr = buff + 23; while(i < err) { if(!memcmp(ptr, "EOT", 3)) break; ip = *(u_int *)ptr; port = *(u_short *)(ptr + 4); printf("%15s %hu\n", inet_ntoa(*(struct in_addr *)&ip), htons(port)); ptr += 7; i += 7; tot++; fprintf(file,"%15s %hu\n", inet_ntoa(*(struct in_addr *)&ip), htons(port)); } }
Тут идет разбор этих символов на то что нужно (ИП адреса и порты)
Вопрос в том, как сделать этот разбор на Пурике, если ответ от сервера содержится в строке.
Буду очень благодарен за помощь <3 Вы моя единственная надежда < 3