1

I am new to socket programming and linux I could find some code about socket programming I want to use this code to connect to a printer , this code is using gethostbyname function which is responsible for getting hostent I think everything is fine except that I have not the host name I just have an IP address (of printer), So what function should I use to connect to the printer by IP ?

this is the code

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

void error(const char *msg)
{
perror(msg);
exit(0);
}

int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;

char buffer[256];
if (argc < 3) {
   fprintf(stderr,"usage %s hostname port\n", argv[0]);
   exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
    error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr,
     server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0) 
     error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0) 
     error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
return 0;
}
1
  • For connecting to a printer, using CUPS is probably more appropriate.... Commented Apr 6, 2013 at 16:27

1 Answer 1

8

Use getaddrinfo instead of gethostbyname. It should accept host names and both IPv4 and IPv6 addresses transparently as long as it uses standard notation.

Do something like this:

int connect_to(char const *host, char const *port)
{
    int sock = -1;
    struct addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    struct addrinfo *servinfo;
    if (getaddrinfo(host, port, &hints, &servinfo) != 0) {
        return sock;
    }

    for (struct addrinfo *serv = servinfo; NULL != serv; serv = serv->ai_next) {
        int tmp = socket(serv->ai_family, serv->ai_socktype, serv->ai_protocol);
        if (tmp == -1) {
            continue;
        }

        if (connect(tmp, serv->ai_addr, serv->ai_addrlen) == -1) {
            close(tmp);
            continue;
        }

        sock = tmp;
        break;
    }

    freeaddrinfo(servinfo);
    return sock;
}
Sign up to request clarification or add additional context in comments.

1 Comment

I did not test your code but in my code I did wrong about the IP address. I mean the gethostbyname works fine with IP address (I had seted wrong IP and when I use correct IP it worked OK) anyway thanks for your answer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.