Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中调试Telnet连接_C_Sockets_Telnet - Fatal编程技术网

在C中调试Telnet连接

在C中调试Telnet连接,c,sockets,telnet,C,Sockets,Telnet,我编写了一个简单的C函数,它连接到一个交换机(通过使用Telnet套接字),并且 运行各种cli命令并退出。 我想使用思科和边缘核心交换机 使用Edge Core交换机,此功能可以正常工作,但在Cisco不起作用,因为它挂起在“登录”过程中 下面是提到的C函数: #include <stdio.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <

我编写了一个简单的C函数,它连接到一个交换机(通过使用Telnet套接字),并且 运行各种cli命令并退出。 我想使用思科和边缘核心交换机

使用Edge Core交换机,此功能可以正常工作,但在Cisco不起作用,因为它挂起在“登录”过程中

下面是提到的C函数:

#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>

char *telnet_switch( char *switch_ip, char *cmd, char cmd_out[] ) {
  char                  buf[5000];
  int                   sock;
  int                   bytes;
  struct sockaddr_in    sw;

  sock = socket( PF_INET, SOCK_STREAM, 0 );

  sw.sin_family      = AF_INET;
  sw.sin_port        = htons( 23 );
  sw.sin_addr.s_addr = inet_addr( switch_ip );

  if ( sock < 0 ) {
    perror("Socket creation error!");
    return (cmd_out);
  }

  if ( connect( sock, (struct sockaddr *) &sw, sizeof( sw ) ) < 0 ) {
    perror("Connect process error!");
    return (cmd_out);
  }

  send( sock, "admin\n\r", 7, 0 );
  usleep(250000);
  bytes = recv( sock, buf, sizeof( buf ), 0 );

  printf("Bytes: %d\n", bytes);  // DEBUG MESSAGE 1.

  send( sock, "test\n\r", 6, 0 );
  usleep(250000);
  bytes = recv( sock, buf, sizeof( buf ), 0 );

  printf("Bytes: %d\n", bytes);  // DEBUG MESSAGE 2.

  send( sock, cmd, strlen( cmd ), 0 );
  send( sock, "\n\r", 2, 0 );

  memset( buf, 0, sizeof( buf ) );
  memset( cmd_out, 0, sizeof( cmd_out ) );

  usleep(250000);
  recv( sock, buf, sizeof( buf ), 0 );

  sprintf( cmd_out, buf );

  close( sock );
  return (cmd_out);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *telnet_switch( char *, char *, char [] );

int main( int argc, char **argv ) {
  char cmd_out[1000000];

  telnet_switch("192.168.16.18", "?", cmd_out);
  printf("%s\n", cmd_out);

  exit (0);
}
所以我不知道为什么它不能登录到Cisco交换机,我尝试增加“usleep”超时,我尝试了“\r\n”字符,但没有成功


有一个调试过程可以解决此问题?

所有这些代码最明显的问题是您使用未知序列
\n\r
作为行终止符。Telnet协议中指定的线路终止符是
\r\n


在调用
recv()
之前,您也不需要睡觉。它会阻塞。

当我需要解决以太网连接问题时,我通常会求助于Wireshark。我认为,如果您将代码的连接过程与使用Wireshark的标准telnet客户端进行比较,您可能会发现自己做错了什么。

您从未实现过任何协议。您不能调用
recv
并期望它接收整个telnet协议或登录消息。这是一个TCP函数。如果需要一直读到出现提示,或者需要读一些行或其他内容,那么需要编写代码来完成这项工作。您不能将睡眠作为同步功能使用——它永远不会可靠。您还应该至少查看您收到的12个字节。您可以尝试打印从Cisco路由器返回的字节吗。您可以将其与常规telnet客户端接收的字节进行比较。它应该给你一个线索。另外,这是哪个路由器/交换机?有些交换机在准备接收身份验证请求之前往往会提供更多数据。我建议将整个内容放入一个select循环,并在套接字上继续读取。0xFFFD 0xFFFD 0xFFFD 0xFFFD 0x020 0xFFFD 0xFFFD 0xFFFD 0x023 0xFFFD 0xFFFD 0xFFFD 0x027这是一个Cisco SG220-26交换机。如果您使用常规telnet客户端会怎么样?连接后,您立即获得的o/p是多少?与之相比,这个o/p有意义吗?另外,将逻辑放在select循环中,并尝试在recv中等待,看看在连接超时时是否获得更多数据。如果服务器正在等待任何特殊序列,它会给出一个想法。@joe,我会尽快尝试。。
szpal@testnms:~/tmp$ ./test
Bytes: 35
Bytes: 110
edge-core:/>
General Commands:
-----------------
Help/?: Get help on a group or a specific command
Up    : Move one command level up
Logout: Exit CLI

Command Groups:
---------------
System      : System settings and reset options
IP          : IP configuration and Ping
Port        : Port management
MAC         : MAC address table
VLAN        : Virtual LAN
...
VCL         : VLAN Control List
Debug       : Switch debug facilities

Type '<group>' to enter command group, e.g. 'port'.
Type '<group> ?' to get list of group commands, e.g. 'port ?'.
Type '<command> ?' to get help on a command, e.g. 'port mode ?'.
Commands may be abbreviated, e.g. 'por co' instead of 'port configuration'.
edge-core:/>
Nyomjon meg egy billentyűt...
szpal@testnms:~/tmp$ ./test
Bytes: 12