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;
}