Enviando struct via winsock em C para servidor em Python.
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()Discussão (0)
Carregando comentários...