Jump to content
  • 0
willianvaneli

Enviando struct via winsock em C para servidor em Python.

Question

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()

 

Share this post


Link to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Marcelo Lopes Vidal
      #include<stdio.h> #include<string.h> #include<stdlib.h> struct aluno { char nome[20]; char endereco[50]; char data_de_nascimento[10]; char telefone[15]; float nota1; float nota2; }; struct aluno recadastramento(struct aluno valuno[10]); void media_das_notas(struct aluno valuno[10]); void aprovado_ou_reprovado(struct aluno valuno[10]); void mostrar_informacoes(struct aluno valuno[10]); int main(void) { struct aluno valuno[10]; int op; float media; int i; int j; printf("Digite as informacoes dos alunos"); for(i=1;i<11;i++) { printf("Digite O Nome Do Aluno[%d]\n\n",i); printf("Nome: "); fflush(stdin); gets(valuno[i].nome); printf("\nDigite O Endereco Do Aluno[%d]\n\n",i); printf("Endereco: "); fflush(stdin); gets(valuno[i].endereco); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); printf("Data De Nascimento: "); fflush(stdin); gets(valuno[i].data_de_nascimento); for(j=0;j <15; j++) { if(valuno[i].data_de_nascimento[2] != '/' && valuno[i].data_de_nascimento[5] != '/') { printf("ERRO! Digite novamente"); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); gets(valuno[i].data_de_nascimento); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite O Telefone Do Aluno [%d] No Formato <(DDD)00000-0000>\n\n",i); printf("Telefone Do Aluno: "); fflush(stdin); gets(valuno[i].telefone); for(j=0;j <15; j++) { if(valuno[i].telefone[0] != '(' && valuno[i].telefone[4] != ')' && valuno[i].telefone[10] != '-') { printf("ERRO! Digite novamente"); printf("Digite O Telefone Do Aluno [%d]: ",i); gets(valuno[i].telefone); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite A Primeira Nota Do Aluno [%d]\n\n",i); printf("Nota 1: "); scanf("%f",&valuno[i].nota1); printf("\nDigite A Segunda Nota Do Aluno [%d]\n\n",i); printf("Nota 2: "); scanf("%f",&valuno[i].nota2); } do { printf("\nMENU\n"); printf("- 1)Editar informações dos alunos \n 2)Mostrar as medias dos alunos \n 3)Dizer se os alunos foram aprovados medias >= 6 ou reprovados (medias <6)\n 4)Listar todas as informações dos alunos"); printf("\n\nOpcao::: "); scanf("%d",&op); switch(op) { case 1: recadastramento(valuno); break; case 2: media_das_notas(valuno); break; case 3: aprovado_ou_reprovado(valuno); break; case 4: mostrar_informacoes(valuno); break; default: printf("\nOpcao INVALIDA\n"); break; } }while(op > 0 && op < 5); } struct aluno recadastramento(struct aluno valuno[10]) //recadastramento de informações//Funções { int i; for(i=1;i<11;i++) { printf("\nDigite O Nome Do Aluno [%d]\n\n",i); printf("Nome: "); fflush(stdin); gets(valuno[i].nome); printf("\nDigite O Endereco Do Aluno [%d]\n\n",i); printf("Endereco: "); fflush(stdin); gets(valuno[i].endereco); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); printf("Data De Nascimento: "); fflush(stdin); gets(valuno[i].data_de_nascimento); int j; for(j=0;j < 11; j++) { if(valuno[i].data_de_nascimento[2] != '/' && valuno[i].data_de_nascimento[5] != '/')//validção de data no formato correto { printf("ERRO! Digite novamente"); printf("\nDigite A Data De Nascimento Do Aluno [%d]No Formato <00/00/0000>\n\n",i); gets(valuno[i].data_de_nascimento); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite O Telefone Do Aluno [%d] No Formato <(DDD)00000-0000>\n\n",i); printf("Telefone Do Aluno: "); fflush(stdin); gets(valuno[i].telefone); for(j=0;j <15; j++)//validção de numero no formato correto { if(valuno[i].telefone[0] != '(' && valuno[i].telefone[4] != ')' && valuno[i].telefone[10] != '-') { printf("ERRO! Digite novamente"); printf("Digite O Telefone Do Aluno [i]: ",i); gets(valuno[i].telefone); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite A Primeira Nota Do Aluno [%d]\n\n",i); printf("Nota 1: "); scanf("%f",&valuno[i].nota1); printf("\nDigite A Segunda Nota Do Aluno [%d]\n\n",i); printf("Nota 2: "); scanf("%f",&valuno[i].nota2); } } void media_das_notas(struct aluno valuno[10])//media de notas { int i; for(i=1;i<11;i++) { float media; media = (valuno[i].nota1 + valuno[i].nota2) / 2; printf("Media: %.2f\n",media); } } void aprovado_ou_reprovado(struct aluno valuno[10])//se foi aprovado ou reprovado { int i; for(i=1;i<11;i++) { float media; media = (valuno[i].nota1 + valuno[i].nota2) / 2; if(media >= 6) { printf("\nAluno [%d] APROVADO\n",i); } else { printf("\nAluno [%d] REPROVADO\n",i); } printf("\nMedia do Aluno[%d]: %.2f\n",i,media); } } void mostrar_informacoes(struct aluno valuno[10])//mostrando informções de cadastro { int i; for(i=1;i<11;i++) { printf("-Listagem Do Aluno[%d]",i); printf("\n\nNome do Aluno[%d]: %s",i,valuno[i].nome); printf("\nEndereco do Aluno[%d]: %s",i,valuno[i].endereco); printf("\nData De Nascimento do Aluno[%d]: %s",i,valuno[i].data_de_nascimento); printf("\nTelefone do Aluno[%d]: %s",i,valuno[i].telefone); printf("\nNota 1 do Aluno[%d]: %.2f ",i,valuno[i].nota1); printf("\nNota 2 do Aluno[%d]: %.2f ",i,valuno[i].nota2); } } //Fim Do Codigo  
    • By Manu Oliveira
      Vetor é um conjunto de variáveis subordinadas a um único nome e struct também é um conjunto de variáveis subordinadas a um único nome.  Meu professor pediu para diferencia -las. mais estou com dificuldade.
       
       
    • By Fah
      Boa Noite Pessoal!
      Estou com dificuldade em implementar um exercício de lista simplesmente encadeada.  Nele pede para criar uma estrutura com os dados de um aluno (matricula, nome e media), e outra para ser a lista (com a estrutura com os dados do aluno e um no com as informações do próximo nó). Uma das opções é para inserir os dados de um novo aluno em ordem crescente de matricula. O código está dando erro. Vocês conseguem me dizer onde estou errando? Vejam meu código:
       
      #include<stdio.h> #include<stdlib.h> #include<string.h> struct aluno{     int matricula;     char nome[100];     float media; }; typedef struct aluno Aluno; struct no{     Aluno* dados;     struct no* prox; }; typedef struct no No; No* cria(No* l){ No* p=(No*)malloc(sizeof(No)); p->dados=NULL; return l; } No* ins_ordenado(No* l,int mat,char* nome,float nota){     Aluno* Al=(Aluno*)malloc(sizeof(Aluno));     No* novo=(No*)malloc(sizeof(No));     int i=0;     Al->matricula=mat;     while(nome!='\0'){        Al->nome=nome;        i++;     }     Al->nome=NULL;     Al->media=nota;     novo->dados=Al;     No*p=l;     No*aux=NULL;     if(l==NULL){         novo->prox=l;         return novo;     }         while(p!=NULL&&p->dados->matricula<Al->matricula){               aux=p;               p=p->prox;         }         novo->prox=aux->prox;         aux->prox=novo;         if(p==NULL){             novo->prox=NULL;         }     return l; } void imprime(No* l){     No* p;     printf("turma 1:\n");     for(p=l;p!=NULL;p->prox){         printf("Matricula: %d\t Nome: %s Nota:%f\n",p->dados->matricula,p->dados->nome,p->dados->media);     }     printf("\n"); } int vazia(No* l){     return(l==NULL); } int main(){ No* l1=cria(l1); l1=ins_ordenado(l1,1,"Maria",5); printf("vazia? %d",vazia(l1)); //imprime(l1); return 0; }
       
      Desde já, Obrigada!
    • By diegowell25
      Preciso criar uma agenda de contatos distribuída com as seguintes características:
      Cada contato deverá conter: nome, número de telefone, número de celular, endereço, e-mail.
      Agenda deve funcionar menu da seguinte forma: adição, remoção, alteração ou pesquisa de algum contato.
      Deve salvar os contatos em um arquivo .txt formatado.
       
      Estou fazendo assim:
      Abro o arquivo em modo de leitura ("r" = read).
       
      Verifico se existe;
      Se não, eu defino o tamanho do vetor e vou para o menu para cadastrar e salvo um novo arquivo em modo de leitura "w";
       
      Se existir, eu leio o arquivo.txt(formatado) e envio os dados para struct (NÃO SEI FAZER ISSO), e continuo a incrementação se for o cada de um novo cadastro, depois salvo tudo (o que ja tinha e o novo cadastro)
       
      Alguém tem algum exemplo de como pode fazer isso sem ser binário?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.