samoliver1914
(usa Lubuntu)
Enviado em 27/12/2014 - 15:42h
Boa tarde pessoal!!
Estou tentado fazer um servido que recebe arquivos de texto, o bind, listen, e o accept não dão nenhum
erro, mas quando chega no recv aparace esse erro: Socket operation on non-socket.
O codigo do server:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define FALSE 0
#define TRUE 1
#define PORT 3015
#define ARQUIVO "recebe.txt"
//abri um aquivo e escreve os dados no arquivo
int grava(char *file, char *modo, char *dados);
//verifica se *str tem /0 no final
int verifica_string(char *str, int tam);
//aguarda dados do cliente e verifica se eles sao um string,
//se sao escrevem no arquivo
void agurda_dados(int sock_fd, struct sockaddr_in *host, char *file, char *modo);
void configura_programa(char *modo, char *arq, int *loop, char *vetor[], int tam_vetor);
int main(int argc, char const *argv[])
{
char *modo;
char *aquivo;
int loop;
int sock;
struct sockaddr_in host;
if(argc < 4){
printf("MODO de uso: %s modo gravacao loop aquivo\n", argv[0]);
printf("mode gravacao: \"w\" para criar arquivo e \"a\" adiciona num arquivo existente\n");
printf("loop: dis se o programa vai fica no loop emfinito ou nao \"TRUE\" ou \"FALSE\"\n");
printf("aquivo: nome do aquivo\n");
exit(0);
}
configura_programa(modo, aquivo, &loop, argv, argc);
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1){
perror("socket()");
exit(1);
}
host.sin_family = AF_INET;
host.sin_port = htons(PORT);
host.sin_addr.s_addr = INADDR_ANY;
bzero(&(host.sin_zero),8);
if(loop == TRUE){
while(TRUE){
agurda_dados(sock, &host, aquivo, modo);
}
}
agurda_dados(sock, &host, aquivo, modo);
return 0;
}
int grava(char *file, char *modo, char *dados){
FILE *r = fopen(file, modo);
if(r == NULL){
perror("fopen()");
exit(1);
}
fputs(dados, r);
fclose(r);
return TRUE;
}
int verifica_string(char *str, int tam){
int i;
char *next = str;
int boole = FALSE;
for(i = 0; i < tam; i++){
if('{TEXTO}' == *next){
boole = TRUE;
break;
}
next++;
}
return boole;
}
void agurda_dados(int sock_fd, struct sockaddr_in *host, char *file, char *modo){
struct sockaddr_in cl;
int tam = sizeof(cl);
char buffer[500];
int sock_vitima;
if(bind(sock_fd, (struct sockaddr*)host, sizeof(*host)) == -1){
perror("bind()");
close(sock_fd);
exit(1);
}
if(listen(sock_fd, 10) == -1){
perror("listen()");
close(sock_fd);
exit(1);
}
printf("Arguadando...\n");
if(sock_vitima = accept(sock_fd, (struct sockaddr*)&cl, &tam) == -1){
perror("accept()");
close(sock_fd);
close(sock_vitima);
exit(1);
}
printf("cliente conecto!!\n");
while(1){
int r = recv(sock_vitima, buffer, 100 ,0);
if(r == -1){
perror("read()");
close(sock_fd);
close(sock_vitima);
exit(1);
}
printf("Leu!!!\n");
buffer[r] == '{TEXTO}';
if(verifica_string(buffer, r)){
printf("Valor Recebido: %s\n", buffer);
if(strcmp(buffer, "END") == 0){
write(sock_fd,"END",sizeof("END"));
close(sock_fd);
close(sock_vitima);
break;
}
grava(file, modo, buffer);
}
}
close(sock_vitima);
close(sock_fd);
}
void configura_programa(char *modo, char *arq, int *loop, char *vetor[], int tam_vetor){
if(strcmp(vetor[1], "w") == 0){
modo = "w";
printf("SERTO!\n");
}
if(strcmp(vetor[1], "a") == 0){
modo = "a";
printf("SERTO!\n");
}
if(strcmp(vetor[1],"w") != 0 && strcmp(vetor[1],"a") != 0){
printf("Valor errado!!\n");
}
if(strcmp(vetor[2], "FALSE") == 0){
*loop = FALSE;
printf("SERTO!\n");
}
if(strcmp(vetor[2], "TRUE") == 0){
*loop = TRUE;
printf("SERTO!\n");
}
if(strcmp(vetor[2],"TRUE") != 0 && strcmp(vetor[2],"FALSE") != 0){
printf("Valor errado!!\n");
}
arq = vetor[3];
}
Como da pra ver pelo codigo tenho muito que aprender ainda!