0

In the next code, while I try to connect a client the server shows the following error:

"invalid argument", I can't see the error.

if((l_sock=socket(AF_INET,SOCK_STREAM,0))!=-1) { struct sockaddr_in srv_dir; srv_dir.sin_family=AF_INET; srv_dir.sin_port=8500; srv_dir.sin_addr.s_addr=INADDR_ANY; if((bind(l_sock,(struct sockaddr *)&srv_dir,sizeof(struct sockaddr_in)))!=-1) { if(!(listen(l_sock,5))) { signal(SIGINT,cerraje); int t_sock; struct sockaddr_in cli_dir; socklen_t tam; time_t tstmp; struct tm * res; res=(struct tm *)malloc(sizeof(struct tm)); while(!key) { if((t_sock=accept(l_sock,(struct sockaddr *)&cli_dir,&tam))!=-1) { tstmp=time(&tstmp); res=gmtime(&tstmp); send(t_sock,res,sizeof(struct tm),0); wr_hora(*res,cli_dir.sin_addr); } else perror("Petición no atendida");//The error is printed here. 

1 Answer 1

10

Read the documentation on accept(2):

The addrlen argument is a value-result argument: it should initially contain the size of the structure pointed to by addr; on return it will contain the actual length (in bytes) of the address returned. When addr is NULL nothing is filled in.

So you need to initialize the value of tam passed into accept with sizeof(cli_dir). You're fortunate that the socket library was able to catch your error, because you're passing in uninitialized memory, which results in undefined behavior.

Sign up to request clarification or add additional context in comments.

1 Comment

That's it, thank you very much. I supposed that the variable tam was only an output value, so I don't even think that it needs an initial value.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.