关键词搜索

源码搜索 ×
×

自己写了一个telnet命令

发布2022-06-19浏览731次

详情内容

大家都知道,linux中有telnet命令,用于探测tcp连接,功能强大。

最近,我写了一个这个命令,试了一下,靠谱:

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <ctype.h>
  9. #include <errno.h>
  10. #include <malloc.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <sys/ioctl.h>
  14. #include <stdarg.h>
  15. #include <fcntl.h>
  16. #include <time.h>
  17. int telnetCheckTcp(const char *ip, int port, int tSecond)
  18. {
  19. int sockClient = socket(AF_INET, SOCK_STREAM, 0);
  20. int iFinal = 0;
  21. struct sockaddr_in addrSrv;
  22. addrSrv.sin_addr.s_addr = inet_addr(ip);
  23. addrSrv.sin_family = AF_INET;
  24. addrSrv.sin_port = htons(port);
  25. fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK);
  26. int iRet = connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in)); // 返回-1不一定是异常
  27. if (iRet != 0)
  28. {
  29. if(errno != EINPROGRESS)
  30. {
  31. iFinal = -1;
  32. }
  33. else
  34. {
  35. struct timeval tm = {tSecond, 0};
  36. fd_set wset, rset;
  37. FD_ZERO(&wset);
  38. FD_ZERO(&rset);
  39. FD_SET(sockClient, &wset);
  40. FD_SET(sockClient, &rset);
  41. int time1 = time(NULL);
  42. int n = select(sockClient + 1, &rset, &wset, NULL, &tm);
  43. int time2 = time(NULL);
  44. if(n < 0)
  45. {
  46. iFinal = -2;
  47. }
  48. else if(n == 0)
  49. {
  50. iFinal = -3;
  51. }
  52. else if (n == 1)
  53. {
  54. if(FD_ISSET(sockClient, &wset))
  55. {
  56. iFinal = 0;
  57. fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK);
  58. }
  59. else
  60. {
  61. iFinal = -4;
  62. }
  63. }
  64. else
  65. {
  66. iFinal = -5;
  67. }
  68. }
  69. }
  70. close(sockClient);
  71. return iFinal;
  72. }
  73. int main(int argc, char *argv[])
  74. {
  75. if(argc != 4)
  76. {
  77. printf("error\n");
  78. return -1;
  79. }
  80. int iFinal = telnetCheckTcp(argv[1], atoi(argv[2]), atoi(argv[3]));
  81. printf("iFinal is %d\n", iFinal);
  82. return 0;
  83. }

经调试,OK.

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载