Hello,
I am using Linux 2.4.18 kernel to do some simple network programming.
I wrote a simple TCP client/server example which is shown below. My
problem is that when the client tries to connect to the server, I get
an error:
Error 22
Invalid Argument
I get this error when the server accepts connection from the client
i.e in the accept() system call.
When I try the same example but with a UDP server( Datagram socket and
no accept system call) and a client it works. I dont know why I keep
getting this error. I would appreciate any help on this.
Code Listing
------------
server.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]){
int sockfd, nsockfd;
struct sockaddr_in servaddr, cliaddr;
int m,n;
socklen_t len, clilen;
char msg[1000];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
servaddr.sin_port = htons(32000);
/* Bind the socket and check for errors */
if(bind(sockfd , (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0
)
{
printf("Error binding Server Socket: ErrorNo:%d\n",errno);
perror("Meaning :");
exit(1);
}
/* Listen at the particular socket */
if(listen(sockfd ,5) < 0 )
{
printf("Error listening Server Socket. ErrorNo: %d\n",errno);
perror("Meaning :");
exit(1);
}
for( ;

{
// Error occurs here
if(( nsockfd = accept(sockfd ,(struct sockaddr *) &cliaddr ,
&clilen) ) < 0 )
{
printf("Error accepting connection. ErrorNo: %d\n",errno);
perror("Meaning :");
close(sockfd);
exit(1);
}
else
{
m = read(sockfd, msg, 1000);
n = write(sockfd, msg, 1000);
printf("-------------------------------------\n");
msg[m] = '\0';
printf("Received the following message\n");
printf("%s", msg);
close(nsockfd);
}
}
close(sockfd);
return 0;
}
client.c
--------
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]){
int sockfd;
struct sockaddr_in servaddr, cliaddr;
int m,n;
char sendline[1000];
char recvline[1000];
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
servaddr.sin_port = htons(32000);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(connect(sockfd,(struct sockaddr *) &servaddr ,sizeof(struct
sockaddr)) < 0)
{
printf("Error Connecting to server. ErrorNo: %d",errno);
perror("Meaning :");
close(sockfd);
exit(1);
}
while(fgets(sendline, 1000, stdin) != NULL){
m = write(sockfd, sendline, 1000);
n = recvfrom(sockfd, recvline,1000, 0 , NULL, NULL);
recvline[n] = '\0';
printf("-----------------------------------------\n");
printf("Message received from server\n");
fputs(recvline, stdout);
}
close(sockfd);
return 0;
}