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