Salve,
sto creando una applicazione server , sotto Linux, ma ho riscontrato un problema: la accept mi da errore "Invalid argument", ma a me sembra tutto ok...posto il codice:
dove questa è la funzione ConnessioneServer:codice:#include <stdio.h> #include <malloc.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <dirent.h> #include <pthread.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/time.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #define INVALID_SOCKET -1 typedef struct sockaddr_in SOCKADDR_IN; typedef int SOCKET; typedef long LONG; int main(int argc, char* argv []){ SOCKADDR_IN Client_addr; SOCKET listenSocket; SOCKET connessione; int id_serv,sin_size,i,n; LONG cnt; LONG volatile flag; LONG volatile client[MAX_SERV]; serv_arg* param; fd_set rset; struct timeval tv; u_long iMode; pthread_t t1; pthread_t t[MAX_SERV]; id_serv=0; for(i=0;i<MAX_SERV;i++) client[i]=0; /*Inizializzazione connessione server*/ listenSocket=ConnessioneServer("127.0.0.1",N_PORT,listenSocket); printf("listensocket:%d\n",listenSocket); if(listenSocket==INVALID_SOCKET){ perror("Errore ConnessioneServer"); return -1; } iMode=1; SetSocket(listenSocket,iMode); flag=1; printf("Mainserver in attesa di client..\n"); while(flag){ FD_ZERO(&rset); FD_SET(listenSocket, &rset); tv.tv_sec = 10; tv.tv_usec = 0; if( (n = select(listenSocket + 1, &rset, NULL, NULL, &tv)) < 0 ){ ChiudiSocket(listenSocket); perror("Errore Select"); return -1; } if(n>0){ connessione = accept(listenSocket, (struct sockaddr*)&Client_addr, &sin_size); if(connessione<=0) perror("Errore Accept"); printf("Accettata Connessione con Client: %s su socket %d\n", inet_ntoa(Client_addr.sin_addr),connessione); param=malloc(sizeof(serv_arg)); for(i=0;i<MAX_SERV;i++) { if(client[i]==0){ client[i]++; break; } if(i==MAX_SERV-1){ sleep(5000); i=0; } } iMode=0; SetSocket(connessione,iMode); (*param).nserv=client+i; (*param).idServ=i; (*param).conn=connessione; (*param).clientAddr.sin_family = AF_INET; (*param).clientAddr.sin_addr.s_addr=Client_addr.sin_addr.s_addr; (*param).clientAddr.sin_port=Client_addr.sin_port; pthread_create(t+i,NULL,&server,(void*)param); } } /*quindi termina */ ChiudiSocket(listenSocket); return 0; }
codice:int ConnessioneServer(char* addr,int port,SOCKET listenSocket){ SOCKADDR_IN Server_addr; SOCKADDR_IN Client_addr; int sin_size; listenSocket = socket(AF_INET, SOCK_STREAM, 0); if (listenSocket < 0) { perror("ConnessioneServer,Errore socket"); ChiudiSocket(listenSocket); return -1; } Server_addr.sin_family = AF_INET; Server_addr.sin_addr.s_addr = inet_addr(addr);; Server_addr.sin_port = htons(port); sin_size = sizeof(SOCKADDR_IN); if (bind(listenSocket,(struct sockaddr*)&Server_addr,sin_size) < 0){ perror("ConnessioneServer,Errore bind"); ChiudiSocket(listenSocket); return -1; } if((listen(listenSocket, MAX_SERV))<0) { perror("ConnessioneServer,Errore listen"); ChiudiSocket(listenSocket); return -1; } return listenSocket; }
Ma questa funzione sembra funzionare bene, non mi da nessun errore infatti il socket ritornato ha valore 3.
Qualcuno sa il perchè di questo problema??

Rispondi quotando