Ir para conteúdo

willianvaneli

Members
  • Total de itens

    1
  • Registro em

  • Última visita

Reputação

0 Comum

Sobre willianvaneli

  1. Preciso enviar struct via winsock de um cliente em C para servidor em Python. to apanhando muito e já fiz diversas mudanças porém não consegui acertar. Resumindo estou completamente perdido. Fiz um cliente que salvava todas informações da estrutura em uma unica string e enviava .... deu tudo certo ... porém quando tento enviar a estrutura tudo cai em ruínas =õ( cliente em C: #include <stdio.h> #include <winsock.h> #include <conio.h> #include <windows.h> #include <string.h> //ESTRUTURA QUE CONTEM OS DADOS PARA ENVIAR PARA O SERVIDOR typedef struct Dados { int idMensagem; int umidade; int temperatura; char data[128]; char confirmacao[2]; }TDados,*PDados; //FUNCAO QUE GERA DADOS A SEREM ENVIADOS PARA O SERVIDOR TDados gera_dados(TDados dados){ srand(time(NULL)); dados.idMensagem++; dados.umidade=30+(rand() % 60); dados.temperatura=(rand() % 100)-50; strcpy(dados.confirmacao,""); /** Gera a data e hora atual:*/ time(&dados.data); strftime(dados.data,sizeof(dados.data), "%H:%M:%S %A %d %b %Y \n", localtime(&dados.data)); printf(dados.data); /*strcpy(dados.date,"Data: "); strcat(dados.date,__DATE__); strcat(dados.date," - Hora: "); strcat(dados.date,__TIME__);*/ return dados; } int main(int argc,char *argv[]) { //DECLARANDO VARIAVEIS WSADATA data; SOCKET winsock; SOCKADDR_IN sock; char strDados[1024]; int bytes; TDados dados; PDados pdados; dados.idMensagem=0; int idCliente=5; while(1){ //INICIALIZANDO WINSOCK if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR){ printf("Erro ao inicializar o winsock"); return 0; } //CRIANDO SOCKET if((winsock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){ printf("Erro ao criar socket"); return 0; } //ESTRUTUDA DO SOCKET sock.sin_family=AF_INET; sock.sin_port=htons(5000); sock.sin_addr.s_addr=inet_addr("127.0.0.1"); //GERANDO DADOS... printf("\n ------------GERANDO OS DADOS--------------- \n"); dados=gera_dados(dados); //sprintf(strDados,"%d,%d,%d,%d,%s",idCliente,dados.idMensagem,dados.umidade,dados.temperatura,dados.date); //printf("\n ------------IMPRIMINDO OS DADOS--------------- \n"); //printf(strDados); printf("\n --------------------------- \n"); //CONEXAO COMO SERVIDOR, CASO NÃO SE CONECTE RETORNA ERRO if(connect(winsock,(SOCKADDR*)&sock,sizeof(sock))==SOCKET_ERROR){ printf("Erro ao se conectar"); return 0; } printf("Conectado!\n"); while(strcmp(dados.confirmacao,"ok")){ printf("Enviando Dados ao servidor!\n"); //ENVIANDO MENSAGEM //char buffer[sizeof(Header)];(TDados*) //memcpy(buffer, &header, sizeof(Header)); char* pdados= (PDados)malloc (sizeof(TDados)*1); /// DEI MOLLOC PRA ENVIAR PELO WINSOCK memcpy(pdados, &dados, sizeof(dados)); /// MEMCPY NEM SEI Q Q ISSO DIREITO USEI PQ MANDARAM if(send(winsock,pdados,sizeof(dados),NULL) < 0){ /// ENVIANDO PELO WINSOCK perror("Erro ao enviar a mensagem \n"); exit(1); } //RECEBENDO CONFIRMACAO printf("Recebendo resposta do servidor!\n"); memset(dados.confirmacao,0,2); bytes=recv(winsock,dados.confirmacao,2,0); if(bytes==-1){ printf("Conexão perdida"); getch(); return 0; }else{ printf("\nMensagem Recebida %s \n",dados.confirmacao); } } closesocket(winsock); //FAZ O PROGRAMA ESPERAR 30 SEGUNDOS PARA ENVIAR NOVA MENSAGEM Sleep(30000); } getch(); closesocket(winsock); WSACleanup(); return 0; } ------------------------------------------------------------------------------------------------------------------------------ servidor em python ... NOTA : AINDA NÃO SEI RECEBER NA ESTRUTURA CORRETAMENTE. import base64 # FUNCAO DE PERSISTENCIA def salvaLog(string): try: with open('log.txt','rt') as arq: conteudo = arq.readlines() if conteudo!="": conteudo.append("\n") conteudo.append(msg) except IOError: print('Arquivo não encontrado!') #~ arq=open('log.txt','rt',encoding="utf-8") #~ conteudo = arq.readlines() #~ if conteudo!="": #~ conteudo.append("\n") conteudo=msg arq=open('log.txt','wt',encoding="utf-8") arq.writelines(conteudo) arq.close() import struct idMensagem=0 umidade=0 temperatura=0 data=b'' confirmacao=b'' import socket HOST = '' # Endereco IP do Servidor PORT = 5000 # Porta que o Servidor esta tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) orig = (HOST, PORT) tcp.bind(orig) tcp.listen(5) while True: print ('Servidor Aberto\n') conexao, cliente = tcp.accept() print ('Conectado por', cliente) print ('Recebendo mensagem\n') msg = conexao.recv(142) print(len(msg)) print (struct.calcsize('i i i 128s 2s')) print (msg) print(msg.decode()) #~ msg= base64.decodebytes(msg) #~ print (msg) #~ print (msg.decode()) cod = struct.unpack('i i i 128s 2s',msg) print (cod) (idMensagem,umidade,temperatura,data,confirmacao) = struct.unpack('i i i 128s 2s',msg) print ("Mensagem recebida, decodificando....\n") msg=msg.decode('UTF-8') print(msg) resposta='ok' conexao.send(resposta.encode()) print ('\nSalvando em LOG as informacoes do cliente', cliente) salvaLog(msg) print ('\nFinalizando conexao do cliente', cliente) print("\n ----------------------------------------- \n") conexao.close()
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.