Hi,
I was writing a simple program using sockets. The program is supposed to be
a TCP server that receives a string sent by the client. For this purpose I
defined a char array called readString which was initially defined as
readString[6]. The program worked fine. I then increased the array size to
readString[100] and the accept socket call started giving an error
(errno=14;EFAUL T). This gave me the impression that the clientAddr structure
was causing this problem, so I declared it as a global variable(see
below).Now the code works fine. Can someone tell me why I am getting this
error? Your help would be greatly appreciated. Thanks. The following is a
brief outline of the code:
struct sockaddr_in clientAddr; //Declaring this here works when I increase
readString from readString[6] to readString[100]
int main()
{
char readString[100],*tempPtr;
struct sockaddr_in serverAddr;//,clientAddr; /*Declaring clientAddr here
does not work when I increase readString from readString[6] to
readString[100]. It gives an EFAULT error for accept. This works fine for
readString[6]*/
..
..
..
if((serverSockF d=socket(AF_INE T,SOCK_STREAM,0 ))<0)
..
..
..
if(bind(serverS ockFd,(struct sockaddr*)&serv erAddr, sizeof(serverAd dr))<0)
..
..
..
if(listen(serve rSockFd,5)<0)
..
..
..
if((clientSockF d=accept(server SockFd,(struct
sockaddr*)&clie ntAddr,&clientA ddrSize))<0)
..
..
..
}
Here is the full text of the code, in case the above does not suffice:
//struct sockaddr_in clientAddr;
int main()
{
int serverSockFd,cl ientSockFd,noOf BytesReadTotal, noOfBytesReadOn eRead;
char readString[100],*tempPtr;
socklen_t clientAddrSize;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
strcpy(readStri ng,"Hello World!");
printf("Before receiving from client readString = %s\n",readStrin g);
if((serverSockF d=socket(AF_INE T,SOCK_STREAM,0 ))<0)
{
printf("Socket failed\n");
exit(1);
}
else
printf("Socket succeeded.\n");
serverAddr.sin_ family=AF_INET;
serverAddr.sin_ port=htons(5002 );
serverAddr.sin_ addr.s_addr=hto nl(INADDR_ANY);
if(memset(serve rAddr.sin_zero, '\0',8)<0)
{
printf("Error in memset\n");
close(serverSoc kFd);
exit(1);
}
if(bind(serverS ockFd,(struct sockaddr*)&serv erAddr, sizeof(serverAd dr))<0)
{
printf("Bind failed\n");
close(serverSoc kFd);
exit(1);
}
else
{
printf("Bind succeeded.\n");
}
if(listen(serve rSockFd,5)<0)
{
printf("Listen failed\n");
close(serverSoc kFd);
exit(1);
}
else
printf("Listen succeeded.\n");
if((clientSockF d=accept(server SockFd,(struct
sockaddr*)&clie ntAddr,&clientA ddrSize))<0)
{
printf("Accept failed\n");
close(serverSoc kFd);
extern int errno;
printf("errno=% d\n",errno);
exit(1);
}
else
printf("Accept succeeded.\n");
noOfBytesReadTo tal=noOfBytesRe adOneRead=0;
tempPtr=readStr ing;
while(noOfBytes ReadTotal<47)
{
noOfBytesReadOn eRead=read(clie ntSockFd,tempPt r,47-noOfBytesReadTo tal);
if(noOfBytesRea dOneRead<0)
{
printf("Error occurred in Read after reading %d
bytes\n",noOfBy tesReadTotal);
close(serverSoc kFd);
close(clientSoc kFd);
extern int errno;
printf("Error no=%d\n",errno) ;
exit(1);
}
noOfBytesReadTo tal++;
tempPtr++;
}
printf("After receiving from client string is %s\n",readStrin g);
close(serverSoc kFd);
close(clientSoc kFd);
}