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:
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;
}
dove questa è la funzione ConnessioneServer:
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??