Good afternoon everyone! I am doing an academic work on Sockets in Language C, in which I need to create an MP3 file transfer program in Windows. In it I have two programs, client and tracker, in which to follow the operation:
The program extends into other functions, but the problem is in topic 3. I do not have much knowledge of this library and I have already researched in several places on the subject, however I come to algorithms that I can not fit into mine through reverse engineering . The client communication with the crawler was successful, but I could not do the reverse, could anyone help me with this? I tried to put a sendTo () on the crawler and recvfrom () on the client, but I did not succeed. Thanks in advance!
TRACKER CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define BUFLEN 512
#define PORT 8888
int servidorON(){
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
char *alvo;
slen = sizeof(si_other) ;
//Inicializar Winsock
printf("\nInicializando Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Erro de Winsock");
exit(EXIT_FAILURE);
}
printf("\n\tInicializado.\n");
//Criando socket
if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
{
printf("Socket nao pode ser criado\n");
}
printf("\tSocket criado.\n");
//Preparando estrutura sockaddr_in
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( PORT );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
printf("Erro de bind()");
exit(EXIT_FAILURE);
}
puts("\tBind realizado.");
printf("Aguardando transacoes...\n");
//Repetição que aguarda as transações
while(1)
{
fflush(stdout);
//Limpa o buffer para o recebimento de dados
memset(buf,'#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define SERVER "127.0.0.1"
#define BUFLEN 512
#define PORT 8888
int requisitarArq(){
struct sockaddr_in server, si_other;
int s, slen=sizeof(si_other);
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
//Inicializar Winsock
printf("\nInicializando Winsock...\n");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Erro ao inicializar Winsock!");
exit(EXIT_FAILURE);
}
printf("Inicializado.\n");
//Criar Socket
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
printf("Erro de socket()!");
exit(EXIT_FAILURE);
}
//Configuração da estrutura de endereço
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
//Comunicação
printf("Requisitar arquivo: ");
scanf("%s", &message);
//Envio da mensagem
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR){
printf("Erro de sentTo()!");
exit(EXIT_FAILURE);
}
//esse print abaixo deve aparecer somente se o arquivo for encontrado no bd do rastreador,
//se ele nao for encontrado, é pra printar só que não foi
//printf("\nServidor: arquivo '%s' encontrado no cliente %s", message, buf);
//o ip enviado deverá gerar uma nova requisição ao novo cliente para o envio do arquivo.
/*memset(buf,'#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define BUFLEN 512
#define PORT 8888
int servidorON(){
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
char *alvo;
slen = sizeof(si_other) ;
//Inicializar Winsock
printf("\nInicializando Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Erro de Winsock");
exit(EXIT_FAILURE);
}
printf("\n\tInicializado.\n");
//Criando socket
if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
{
printf("Socket nao pode ser criado\n");
}
printf("\tSocket criado.\n");
//Preparando estrutura sockaddr_in
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( PORT );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
printf("Erro de bind()");
exit(EXIT_FAILURE);
}
puts("\tBind realizado.");
printf("Aguardando transacoes...\n");
//Repetição que aguarda as transações
while(1)
{
fflush(stdout);
//Limpa o buffer para o recebimento de dados
memset(buf,'#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define SERVER "127.0.0.1"
#define BUFLEN 512
#define PORT 8888
int requisitarArq(){
struct sockaddr_in server, si_other;
int s, slen=sizeof(si_other);
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
//Inicializar Winsock
printf("\nInicializando Winsock...\n");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Erro ao inicializar Winsock!");
exit(EXIT_FAILURE);
}
printf("Inicializado.\n");
//Criar Socket
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
printf("Erro de socket()!");
exit(EXIT_FAILURE);
}
//Configuração da estrutura de endereço
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
//Comunicação
printf("Requisitar arquivo: ");
scanf("%s", &message);
//Envio da mensagem
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR){
printf("Erro de sentTo()!");
exit(EXIT_FAILURE);
}
//esse print abaixo deve aparecer somente se o arquivo for encontrado no bd do rastreador,
//se ele nao for encontrado, é pra printar só que não foi
//printf("\nServidor: arquivo '%s' encontrado no cliente %s", message, buf);
//o ip enviado deverá gerar uma nova requisição ao novo cliente para o envio do arquivo.
/*memset(buf,'%pre%', BUFLEN);
recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &server, sizeof(server));
printf("\nServidor: arquivo '%s' encontrado no cliente %s", message, buf); */
closesocket(s);
WSACleanup();
return 0;
}
// MAIN
int main(){
requisitarArq();
return 0;
}
', BUFLEN);
//Tenta receber dados com blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
printf("Erro de recvfrom()!\n");
exit(EXIT_FAILURE);
}
//Exibe os dados recebidos
printf("\nPacote recebido de %s:%d", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
printf("\nRequisicao: %s\n" , buf);
alvo=verificarBancoDados(buf);
if(alvo == 0){
printf("Arquivo nao encontrado.\n");
}else{
//aqui é pra ser colocado o envio ao cliente requisitante do ip do detentor do arquivo ao invés desse print(deve ser apagado)
printf("Encontrado em: %s\n", alvo);
//sendto(s, alvo, strlen(alvo) , 0 , (struct sockaddr *) &si_other, sizeof(si_other));
}
//Passos:
//verificar se existe no bd [FEITO]
//retornar ao usuário se tem ou não
//se existir responder ao usuário quem tem aquele arquivo
}
closesocket(s);
WSACleanup();
return 0;
}
int verificarBancoDados(char *requisicaoBuf){
char ip[16], chave[32];
int i;
FILE *arq = fopen("bancoDeDados.txt", "rt");
while( (fscanf(arq, "%s %s\n", &ip, &chave)) != EOF){
if((strcmp(chave, requisicaoBuf))== 0){
printf("O arquivo '%s' foi encontrado no cliente %s\n", &chave, &ip);
fclose(arq);
return ip;
}
}
fclose(arq);
return 0;
}
// MAIN
int main(){
servidorON();
return 0;
}
', BUFLEN);
recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &server, sizeof(server));
printf("\nServidor: arquivo '%s' encontrado no cliente %s", message, buf); */
closesocket(s);
WSACleanup();
return 0;
}
// MAIN
int main(){
requisitarArq();
return 0;
}
', BUFLEN);
//Tenta receber dados com blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
printf("Erro de recvfrom()!\n");
exit(EXIT_FAILURE);
}
//Exibe os dados recebidos
printf("\nPacote recebido de %s:%d", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
printf("\nRequisicao: %s\n" , buf);
alvo=verificarBancoDados(buf);
if(alvo == 0){
printf("Arquivo nao encontrado.\n");
}else{
//aqui é pra ser colocado o envio ao cliente requisitante do ip do detentor do arquivo ao invés desse print(deve ser apagado)
printf("Encontrado em: %s\n", alvo);
//sendto(s, alvo, strlen(alvo) , 0 , (struct sockaddr *) &si_other, sizeof(si_other));
}
//Passos:
//verificar se existe no bd [FEITO]
//retornar ao usuário se tem ou não
//se existir responder ao usuário quem tem aquele arquivo
}
closesocket(s);
WSACleanup();
return 0;
}
int verificarBancoDados(char *requisicaoBuf){
char ip[16], chave[32];
int i;
FILE *arq = fopen("bancoDeDados.txt", "rt");
while( (fscanf(arq, "%s %s\n", &ip, &chave)) != EOF){
if((strcmp(chave, requisicaoBuf))== 0){
printf("O arquivo '%s' foi encontrado no cliente %s\n", &chave, &ip);
fclose(arq);
return ip;
}
}
fclose(arq);
return 0;
}
// MAIN
int main(){
servidorON();
return 0;
}
CUSTOMER CODE:
%pre%