[英]Socket programming in Linux by C++
我正在openSUSE 12.3中開發一個C ++應用程序,其中一個部分負責通過Socket(在LAN中)向設備發送數據。 我正在使用此代碼
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *printer;
portno = 9100;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) error("ERROR opening socket\n");
printer = gethostbyname("100.0.69.23");
if(printer == NULL) error("No such device on 100.0.69.23\n");
//set bit set to zero
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) printer->h_addr, (char *) &serv_addr.sin_addr.s_addr, printer- >h_length);
serv_addr.sin_port = htons(portno);
if(connect(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0)
{error("ERROR connecting");
return;
}
n = write(sockfd, data, datalenght);
if(n < 0) error("ERROR sending command to printer");
n = read(sockfd, buffer, 200);
我認為代碼是正確的但是connect函數返回-1並且似乎無法連接到設備(打印機)。 這段代碼是用openSUSE 11編寫的,工作正常,我可以向設備發送/接收數據但是當我將它復制/粘貼到新系統(openSUSE 12.3)時,它會讓我無法連接。 我在正在使用的特定IP上ping結果顯示設備可通過LAN訪問
我想你應該考慮的可能性hostent
通過返回gethostbyname
功能可能有AF_INET6
地址族(在這種情況下,將支持IPv6,而不是IPv4地址)。
http://linux.die.net/man/3/gethostbyname
因此,您可以使用GNU擴展函數gethostbyname2
函數來指定地址族。
printer = gethostbyname2("100.0.69.23", AF_INET);
或者你可以使用getaddrinfo
函數,因為文檔說gethostbyname
函數已經過時了。
如前所述,您在初始化之前檢查printer == NULL
。 我認為你的意思是:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket\n");
printer = gethostbyname("100.0.69.23");
...
此外,代碼的結構似乎表明當你想向打印機發送命令時你connect()
, write()
然后read()
,如果你只發送一個命令就沒關系,但如果你是發送多個命令。 在后一種情況下,您希望將connect()
與write()
分開,因為connect()
相當昂貴,因此您只需要執行一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.