recv(): Socket operation on non-socket [RESOLVIDO]

1. recv(): Socket operation on non-socket [RESOLVIDO]

samuel
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!


  


2. Re: recv(): Socket operation on non-socket [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/12/2014 - 23:32h

Eu não olhei o código todo, mas onde você disse

if(sock_vitima = accept(sock_fd, (struct sockaddr*)&cl, &tam) == -1) 


provavelmente quis dizer

if((sock_vitima = accept(sock_fd, (struct sockaddr*)&cl, &tam)) == -1) 


.


3. Socket operation on non-socket

samuel
samoliver1914

(usa Lubuntu)

Enviado em 28/12/2014 - 11:01h

O erro era esse mesmo, nunca ia imagina que o erro era esse, muito obrigado!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts