我是新来的套接字编程和Linux我可以find一些关于套接字编程的代码我想用这个代码来连接到打印机,这个代码是使用gethostbyname函数,它负责获取hostent我认为一切都很好,除了我没有主机名我只有一个IP地址(打印机),那么我应该用什么函数来通过IP连接打印机?
这是代码
#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; }
使用getaddrinfo
而不是gethostbyname
。 它只要使用标准符号,就可以透明地接受主机名和IPv4和IPv6地址。
做这样的事情:
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; }