Enviado em 19/07/2016 - 18:39h
Boa noite pessoal, bom estou tentando fazer um cliente e um servidor para uma comunicação "segura" via internet, óbvio que este é um programa de estudos e não tem nada de seguro, mas é o meu começo./* Cliente */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> int main(int argc,char *argv[]){ int sockfd,porta=0; struct sockaddr_in servidor; struct hostent *server; char username[20],userserver[20],mensagem[256]; if(argc<3) { printf("Usage: %s <ip/dns> <port>\n",argv[0]); exit(1); } printf("Chose a username: "); __fpurge(stdin); if(scanf("%19[a-zA-Z0-9-_]",username)==0 || strlen(username)==1) { printf("Please, chose a valid username.\n"); exit(1); } sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { fprintf(stderr,"SOCKET: %s\n",strerror(errno)); exit(1); } server=gethostbyname(argv[1]); if(server == NULL) { fprintf(stderr,"unknown host.\n"); exit(1); } porta=atoi(argv[2]); if(porta<0 || porta>65535) { printf("Especify a valid port!\n"); exit(1); } bzero((char*)&servidor,sizeof(servidor)); servidor.sin_family=AF_INET; bcopy((char *)server->h_addr,(char *)&servidor.sin_addr.s_addr,server->h_length); servidor.sin_port=htons(porta); if(connect(sockfd,(struct sockaddr *)&servidor,sizeof(servidor))==-1) { fprintf(stderr,"CONNECT: %s\n",strerror(errno)); exit(1); } system("clear"); printf("\nSucessfully connected to: %s\n",inet_ntoa(servidor.sin_addr)); printf("To quit, say \"-exit\"\n"); do { send(sockfd,username,sizeof(username),0); bzero(mensagem,256); printf("%s: ",username); __fpurge(stdin); scanf("%[^\n]",mensagem); send(sockfd,mensagem,sizeof(mensagem),0); bzero(mensagem,256); bzero(userserver,20); recv(sockfd,userserver,sizeof(userserver),0); recv(sockfd,mensagem,sizeof(mensagem),0); printf("%s: %s\n",userserver,mensagem); }while(strcmp(mensagem,"-exit")!=0); close(sockfd); return 0; }
/* Servidor */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc,char *argv[]){ int sockfd,conectado,porta=0; socklen_t sizesocket; struct sockaddr_in servidor,cliente; char username[20],userclient[20],mensagem[256]; if(argc<2) { printf("Usage: %s port\n",argv[0]); exit(1); } porta=atoi(argv[1]); if(porta<0 || porta>65535) { printf("Especify a valid port!\n"); exit(1); } printf("Chose a username: "); __fpurge(stdin); if(scanf("%19[a-zA-Z0-9-_]",username)==0 || strlen(username)==1) { printf("Please, write a valid username.\n"); exit(1); } sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { fprintf(stderr,"SOCKET: %s\n",strerror(errno)); exit(1); } bzero ((char *)&servidor,sizeof(servidor)); servidor.sin_family=AF_INET; servidor.sin_addr.s_addr=INADDR_ANY; servidor.sin_port=htons(porta); sizesocket=sizeof(cliente); if(bind(sockfd,(struct sockaddr *)&servidor,sizeof(servidor))==-1) { fprintf(stderr,"BIND: %s\n",strerror(errno)); exit(1); } else printf("Bind sucessfully!\n"); if(listen(sockfd,0)==-1) { fprintf(stderr,"LISTEN: %s\n",strerror(errno)); exit(1); } else printf("Listening on %d\n",porta); conectado=accept(sockfd,(struct sockaddr *)&cliente,&sizesocket); if(conectado==-1) { fprintf(stderr,"ACCEPT: %s\n",strerror(errno)); exit(1); } close(sockfd); system("clear"); printf("\nClient: %s sucesfully connected to the server.\n",inet_ntoa(cliente.sin_addr)); printf("To quit, say \"-exit\"\n"); printf("Please, wait some contact :)\n"); do { send(conectado,username,sizeof(username),0); bzero(mensagem,256); bzero(userclient,20); recv(conectado,userclient,sizeof(userclient),0); recv(conectado,mensagem,sizeof(mensagem),0); printf("%s: %s\n",userclient,mensagem); printf("%s: ",username); __fpurge(stdin); scanf("%[^\n]",mensagem); send(conectado,mensagem,sizeof(mensagem),0); }while(strcmp(mensagem,"-exit")!=0); close(conectado); return 0; }
Enviado em 19/07/2016 - 20:38h
Palpiteiro que sou vou palpitar, não sei enquanto a linguagem C (estou tentando ler seu programa mas acho que vou aprender a falar mandarim antes de conseguir ler algo em C) kkkk. Em python o recv() tem de estar dentro de um loop, por exemplo um while True para receber mensagens processar e depois voltar a escutar até que um dos dois encerre a conexãodef server(interface, port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) sock.bind((interface, port)) sock .listen(1) print('Lstening at', sock.getsockname()) while True: sc, sockname = sock.accept() message = sock.recv(sc, 16) print('Incoming sixteen-octet message', repr(message)) sc.close()
Enviado em 20/07/2016 - 04:20h
Vou dar uma estudada na função "select()" e ver o que da pra fazer.Enviado em 20/07/2016 - 17:10h
Caro Cristhohher994,Enviado em 21/07/2016 - 08:24h
tux-gpt - Assistente de IA para o Terminal
Instalação e configuração do Chrony
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Como instalar no Linux Jogos da Steam só para Windows
Instalando o Team Viewer no Debian Trixie - problema no Policykit
O Que Fazer Após Instalar Ubuntu 25.04
Como fzr Downgrade em um pacote específico (5)
Inspiração para desenhar no Linux (1)
Os empreguim de meu Deus estão cada vez mais tecnológicos (6)