user2725511
user2725511

Reputation: 43

Socket Programming in C(Client Server Example)

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

Answers (4)

NeilBlue
NeilBlue

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

Jeyamaran
Jeyamaran

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

nouney
nouney

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

user2699113
user2699113

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

Related Questions