2013-11-22 141 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

回答