TCP建立连接需要使用三次握手协议。在Linux下的socket API,服务器使用socket, bind, listen, accept的过程打开并且监听端口,客户端使用socket,bind(可有可不有),connect的过程连接到服务器的某一个端口。当客户端要连接的服务器的端口开放,客户端利用connect可以通过三次握手协议正常建立连接。当客户端要连接的服务器的端口关闭,客户端connect到服务器的时候,服务器响应RST,客户端connect返回ECONNREFUSED错误。可以通过这个连接是否成功来判断端口是否打开。以下是端口扫描代码:

#include

#include

#include

#include

#include

#include

#define MAXLINE 4098

int main(int argc, char **argv)

{

int sockfd, n;

struct sockaddr_in servaddr;

//input the IP address and port(from argv[2] to argv[3])

if (argc != 4) {

printf("usage: fulfill the cmd\n");

return -1;

}

int i;

//atoi():char* to int

for (i = atoi(argv[2]); i < atoi(argv[3]); i++) {

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

printf("socket error\n");

return -1;

}

//include in string.h

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(i);

//inet_pton include in

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {

printf("inet_pton error\n");

}

if (connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0) {

//printf("unuseful port: %d\n", i);

close(sockfd);

continue;

}

else {

printf("useful port: %d\n", i);

close(sockfd);

continue;

}

}

exit(0);

}

程序实例输出:

运行程序,输入要扫描的IP地址,起始端口号和最终端口号。然后就会列出打开的端口。这里我用127.0.0.1测试自己的电脑打开的可被连接的TCP端口。

程序解释:

程序是单进程的方式。

argc判断输入的命令是否正确。

atoi()将char *格式的字符串转换为int格式

整个过程都是正常的创建TCP socket和connect的过程,比较简单。

sockfd = socket()需要在for循环里面,因为TCP的套接字描述符不能重用,需要在每个TCP的connect创建连接之前重新创建一个新的套接字描述符。

每次connect之后都需要利用close()把套接字描述符关闭,从而释放系统资源,避免超过可创建描述符达到上限而无法创建新的套接字(关于上限的问题还需要进一步查资料)。关于套接字可以参考 http://hi.baidu.com/hwzaeolskllprze/item/efd6a7c617168750bcef69f7 加深理解。

linux 网络端口全连接扫描,端口全连接扫描程序(Linux, socket):TCP的connect方式...相关推荐

  1. Linux网络编程:用C语言实现的聊天程序(同步通信)

    通过TCP协议,用C语言实现的同步聊天程序,注释写的比较详细,个人觉得对字符串处理比较充分,能够正常编译运行,拿出来和大家分享一下! 1.客户端源代码: [cpp] view plaincopypri ...

  2. 27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

    基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了, 分层模型, 物数网传会表 ...

  3. linux网络操作系统电大考试,国开2020年秋《linux网络操作系统》形考任务题库大全...

    国开2020年秋<linux网络操作系统>形考任务题库大全 信息只能转换和传递,但不可以再生.选择一项对 题目2未回答满分1.00 标记题目题干第三代移动通信系统即3G通信系统信息传输速率 ...

  4. Linux网络编程篇之ICMP协议分析及ping程序实现

    Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...

  5. winscp链接linux网络错误被决绝,解决了winscp连接不上的问题

    在windows系统和虚拟机装的linux上互传文件时,可以用winscp.第一次用winscp时,老是连接不到linux上.但是两个系统都可以上网,还能ping通.还以为是端口22被什么进程占用. ...

  6. linux网络编程之广播详细代码及文档说明 -,Linux网络编程之广播

    1.概念 前面介绍的TCP,UDP都是单播方式,即一对一.而广播是一台主机向局域网内的所有主机发送数据.这时,同一网段的所有主机都能接收到数据.发送广播包的步骤大致如下: (1)确定一个发送广播的接口 ...

  7. linux 网络不可达 网卡,我的服务器日志中的linux – (网络不可达)错误

    我的Centos消息日志文件中有很多网络无法访问的行.他们似乎无法解决某些地址,我没有任何想法,为什么我的服务器必须首先解决它们.谁能让我知道这种错误的根源?我受到了攻击吗? Oct 23 11:39 ...

  8. Linux网络编程一步一步学+基础

    转自:http://blogold.chinaunix.net/u1/48325/showart_413841.html ·Linux网络编程基础(一) ·Linux网络编程基础(二) ·Linux网 ...

  9. Linux网络编程基础和一步一步学

    ·Linux网络编程 基础(一) ·Linux网络编程 基础(二) ·Linux网络编程 基础(三) ·Linux网络编程 基础(四) ·Linux网络编程 基础(五) ·Linux网络编程 基础(六 ...

最新文章

  1. 【原创】WinCE下流驱动开发流程
  2. fiddler下如何将HTTPS转换成HTTP
  3. 学习webpack(二)
  4. 学习历史预测未来,国防科大新模型实现未来事实预测SOTA
  5. windows中wnmp设置nginx启动脚本
  6. Ubuntu下Authentication token manipulation error或者Authentication Failure解决办法
  7. 边际概率条件概率_数据科学家解释的边际联合和条件概率
  8. vs2008 调试js
  9. 服务器虚拟化nas存储服务器搭建,采用NAS架构优化VMware服务器虚拟化环境的存储管理.pdf...
  10. 简洁jQuery滑动门插件
  11. crackme--Cruehead-CrackMe-3
  12. 前搜房网副CTO曹艳白干了件大事!
  13. 苹果 CEO 库克“喜当爹”,女子为其孕育双胞胎,索赔31.6亿分手费!
  14. win7台式计算机型号怎么查,win7怎么看电脑型号 win7电脑型号怎么查
  15. vscode插件不兼容无法安装
  16. QuickBooks 2020 for Mac(mac财务管理软件)
  17. 闲鱼提效最佳实践:打造OKR机制下的数据驱动敏捷团队
  18. 基于Python实现的桌面图书管理系统
  19. sqoop的入门使用
  20. 中国脑磁共振设备行业应用形势与前景动态预测报告2022-2027

热门文章

  1. linux-headers,如何升级linux-headers-generic?
  2. android平台代号、版本、API 级别和 NDK 版本
  3. 对BottomTagFragment的理解
  4. 【读书笔记】【独立思考】2018-03-14
  5. Java 文件操作-RandomAccessFile
  6. Too many open files 问题的解决
  7. C++对txt文本进行读写操作
  8. 这几天的学习进度总结
  9. pbxproj文件冲突解决办法
  10. jQuery.ajax()方法