簡體   English   中英

C ++在Linux中進行套接字編程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM