Socket

1. Socket

Rômulo Dimas
Jimmy_N

(usa Ubuntu)

Enviado em 10/12/2010 - 21:06h

Boa noite pessoal, estou tendo problemas com um programinha q teóricamente deveria capturar um texto digitado pelo usuário e enviar para um servidor armazená-lo. Declarei algumas libs num arkivo .h e conecto no servidor passando o ip como parametro na hora de executar o cliente.
O problema está em como enviar os dados. Bom, o código está aí, espero q alguém possa me dar uma luz.

#include <stdio.h>
#include <stdlib.h>
#include "./cliente_servidor.h"

void cliente_tcp()
{
int pkt_enviar = 0;
int sockfd = 0;
int numbytes = 0;
int id = 0;
int addr_len = 0;
int sin_size = sizeof(struct sockaddr_in);

mensagem *msg_send = (mensagem *) malloc (sizeof(mensagem));
mensagem *msg_recv = (mensagem *) malloc (sizeof(mensagem));

struct sockaddr_in serv_addr;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(TCP_C_SERV_PORT);
serv_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(serv_addr.sin_zero), 8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}

id++;

if (pkt_enviar != 1)
{
msg_send->id_msg = id;
}
else
{
msg_send->id_msg = NUM_MAX_PKTS + 1;
}

// msg_send->inicio = 0;
// msg_send->final = 0;

if (send(sockfd, msg_send, sizeof(msg_send), 0) == -1)
{
perror("send");
exit(0);
}

if ((numbytes=recv(sockfd, msg_recv, sizeof(msg_recv), 0)) == -1)
{
perror("recv");
exit(1);
}

if (msg_recv->id_msg == (NUM_MAX_PKTS + 1))
{
msg_recv->id_msg = id;
}

pkt_enviar--;
close(sockfd);
free(msg_send);
free(msg_recv);
}

int main(int argc, char *argv[])
{
int op = 0;
char msg_send;
if (argc != 2)

{
fprintf(stderr,"usage: ./cliente <ip do servidor>\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
do
{
int not, remove;
char resp, select;
printf("\n Escolha uma opção:\n");
printf("\n1 - Publicar nova noticia");
printf("\n2 - Consultar noticias existentes");
printf("\n3 - Visualizar noticia");
printf("\n4 - Remover noticia");
printf("\n5 - Sair\n");
scanf ("%d", &op);
switch(op)
{
case 1:
{
system ("touch noticia.txt");
printf ("\nDigite a nova noticia\n");
fgets (strcat *msg_send);


{
FILE *fd;
fd=fopen ("noticia.txt", "w");
fputs (strcat *msg_send, fd);
fclose(fd);
}
break;
}
case 2:
{
printf ("\nLista de noticias existentes:\n");
system ("ls *.txt |cat -n > lista.rtf\n");
system ("cat lista.rtf");
break;
}
case 3:
{
printf ("\nSelecione a noticia:\n");
scanf ("%d",&not);
{
FILE *fd;
char buffer[1000];
fd=fopen ("noticia.rtf", "r");
while (!feof(fd))
{
fgets(buffer,100, fd);
printf ("%s",buffer);
}
}
break;
}
case 4:
{
printf ("\nDigite o numero da noticia que voce deseja remover:\n");
scanf ("%d",&remove);
system ("cat lista.rtf|grep -v $remove >lista.rtf");
break;
}
case 5:
{
printf ("\nSair\n");
exit(1);
break;
}
default: printf("Opcao invalida");
}
}
while(op != 5);

}



  


2. Re: Socket

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 10/12/2010 - 22:59h

Opa,

Sua dificuldade está em trocar arquivos... Ou tem outra coisa, algum erro? Para troca de arquivos o modo mais simples, é enviar seu conteúdo. Simples assim, abra-o, envie o mesmo no fluxo. E pronto, ele chegou do outro lado.

Abraços


3. Re: Socket

Rômulo Dimas
Jimmy_N

(usa Ubuntu)

Enviado em 11/12/2010 - 10:21h

Na verdade existem erros. É q eu ainda não entendi direito o lance de fazer conexão com o servidor e enviar dados ná prática. Me disseram q tem coisa fora de ordem no código e o q eu pensei em fazer não deu certo, q foi pegar o q o usuário digita (apontado por FD)e enviar pelo MSG_SEND. O código tá incompleto por isso tbm.


4. Re: Socket

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 11/12/2010 - 11:31h

Opa,

Sempre há tempo de aprender. Aqui no VoL tem este excelente artigo : http://www.vivaolinux.com.br/artigo/BSD-Sockets-em-linguagem-C/ . Sem nenhuma dúvida, em língua portuguesa é um dos melhores. Além disso, temos o livro do Stevens.
Bom, uma abordagem seria:
Servidor - abre um socket e ficar a esperar conexões, e por fim as responde
Cliente - conecta-se ao servidor e faz uma solicitação, e por fim aguarda resposta

Bom, por hora é so,

Poste aí sua evolução,

Abraços






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts