Reputation: 43
I am completely new to programming in unix and have written the following code for client and server programming. When I try to run the client code it says "Connection refused". Could somebody please tell me what could be the reason of it.
Server Code :
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int sockid,newsockid;
socklen_t addr_size;
char *msg="What a beautiful morning!";
int len, bytes_sent;
sockid=socket(AF_INET,SOCK_STREAM,0);
if(sockid==-1)
{
perror("socket");
exit(1);
}
else
printf("created");
struct sockaddr_in serveraddr,clientaddr;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
perror("bind");
return -1;
}
listen(sockid,5);
addr_size=sizeof(clientaddr);
newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size);
len = strlen(msg);
bytes_sent = send(sockid, msg, len, 0);
close(sockid);
}
Client Code :
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int byte_count;
struct sockaddr_in serveraddr;
char *servername;
char buf[256];
socklen_t addr_size;
int sockfd;
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(11378);
servername=gethostbyname("localhost");
inet_pton(AF_INET,servername,&serveraddr.sin_addr);
addr_size=sizeof(serveraddr);
if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1)
{
perror("connect");
exit(1);
}
byte_count = recv(sockfd, buf, sizeof buf, 0);
printf("recv()'d %d bytes of data in buf\n", byte_count);
close(sockfd);
}
An early help would be appreciated. Thanks.
Upvotes: 4
Views: 46417
Reputation: 173
Make sure to include errno.h in your program.
Add line printf("%s", strerr(errno));
in your program after any failure. Any system call failure sets correct errno making it simple to diagnose the problem.
Upvotes: 1
Reputation: 783
check the port. server port is 7400 but the client try to connect with port number 11378 so only connection has been refused.
Upvotes: 4
Reputation: 4411
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
inet_pton(AF_INET,servername,&serveraddr.sin_addr); // here
You're passing servername
to inet_pton()
but it is not initialized ! So inet_pton()
will fail. You should check its return value.
servername=gethostbyname(); //here
addr_size=sizeof(serveraddr);
The second problem is that you're not using gethostbyname()
correctly.Take a look at the manpage, you will see that gethostbyname()
is taken arguments and it returns a pointer to a struct hostent
, not a pointer to char
like you did. Your compiler doesn't warn you about this because you don't include netdb.h
.
You should check the return values of all the functiond that you are using, it's avoid problems like that. You should enable some flags of your compiler (like alk said in the question comments, -W -Wextra -Wall -pedantic are really great flags).
Upvotes: 4
Reputation: 4509
Well, you have to be sure that your server is running and listening on proper port (7400). Just check with: "netstat -tanp" if there is something listening on port 7400 and then try to connect.
Upvotes: 0