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);
仔細閱讀'read()'/'write()'的手冊頁,並瞭解到至少對於套接字來說,這兩個函數並不一定讀/寫的字節數與它們被告知的一樣多,但很少。因此,圍繞此類呼叫進行計數,直到收到/發送所有數據都是一個好主意,而不是說必不可少。如果您不知道預計可以提前閱讀的數據大小,請逐個閱讀字節。 – alk
你在while循環結束時立即緩衝區是空的,而不是當另一邊完成傳輸時。這在接收所有數據時會有問題。 – Duck
嘗試閱讀套接字教程。你這樣做的方式非常不規範,很難成功。 – usr