2013-11-22 74 views
2

我想從CMTS中檢索調制解調器列表,然後我用C編寫了一個telnet客戶端,它正在執行此操作。 問題是,有時我沒有從CMTS獲取所有數據。 (如果我減少了「延遲」的等待時間,我越不會得到所有的數據。)從C中telnet套接字讀取

char buf[50000]; 
int nbytes, sock; 
struct sockaddr_in cmts; 

cmts.sin_family  = AF_INET; 
cmts.sin_port  = htons(23); 
cmts.sin_addr.s_addr = inet_addr("192.168.1.1"); 

sock = socket(PF_INET, SOCK_STREAM, 0); 

if (sock < 0) { 
    perror("Socket creation error!"); 
    exit (EXIT_FAILURE); 
} 

if (connect(sock, (struct sockaddr *) &cmts, sizeof(cmts)) < 0) { 
    perror("Connect process error!"); 
    exit (EXIT_FAILURE); 
} 

write(sock, "testuser\n", 9); 
write(sock, "testenapwd\n", 11); 
write(sock, "terminal length 0\n", 18); 
usleep(100000); 
read(sock, buf, sizeof(buf)); 
usleep(100000); 
write(sock, "show cable modem\n", 17); 
usleep(100000); 

while (1) { 
    nbytes = 0; 
    ioctl(sock, FIONREAD, &nbytes); 

    if (!nbytes) { break; } 
    else { 
     memset(buf, 0, sizeof(buf)); 
     nbytes = read(sock, buf, sizeof(buf) -1); 
     printf("%s", buf); 
     printf(">>>%d<<<\n", nbytes); // for debug 
    } 

    usleep(300000); // delay 
} 

close(sock); 
exit (EXIT_SUCCESS); 
+4

仔細閱讀'read()'/'write()'的手冊頁,並瞭解到至少對於套接字來說,這兩個函數並不一定讀/寫的字節數與它們被告知的一樣多,但很少。因此,圍繞此類呼叫進行計數,直到收到/發送所有數據都是一個好主意,而不是說必不可少。如果您不知道預計可以提前閱讀的數據大小,請逐個閱讀字節。 – alk

+1

你在while循環結束時立即緩衝區是空的,而不是當另一邊完成傳輸時。這在接收所有數據時會有問題。 – Duck

+0

嘗試閱讀套接字教程。你這樣做的方式非常不規範,很難成功。 – usr

回答