Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >lsof看到sock fd但是netstat查看不到socket连接的场景

lsof看到sock fd但是netstat查看不到socket连接的场景

原创
作者头像
cdh
发布于 2023-06-07 14:39:14
发布于 2023-06-07 14:39:14
94900
代码可运行
举报
文章被收录于专栏:笔记+笔记+
运行总次数:0
代码可运行

场景1:

应用程序创建了socket,但是当作为client端时没有调用connect去连接server端:

模拟构造问题现象程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
int sockfd[16] = {0};
int i=0;
for(i=0;i<16;i++)
{
sockfd[i] = socket(AF_INET,SOCK_STREAM,0);
if (sockfd[i] == -1){
printf("Fail to create a socket.");
}

}
while(1)
sleep(10);

}

场景二:

client端连接server端后,三次握手连接已经建立了,然后client端发起关闭连接,server端也不做关闭连接处理,最后连接被client端rst掉,导致fd还在,但是netstat看到连接不存在。

模拟构造问题现象:

1 先运行server端程序./server

 2 client端发起连接前状态

3. client端发起连接后状态:

4. 连接被关闭后netstat查看tcp连接已经不存在,但是fd还在

构造问题现象代码实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server端:

# cat server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};

server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}

address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);

if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}

if (listen(server_fd, 5) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}

new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);
if (new_socket < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}

read(new_socket, buffer, BUFFER_SIZE);
printf("Message received: %s\n", buffer);
sleep(120);
write(new_socket, buffer, BUFFER_SIZE);
while(1)
  sleep(10);
return 0;
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client端:

# cat client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *message = "Hello from client";
char buffer[BUFFER_SIZE] = {0};

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);

if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
perror("invalid address");
exit(EXIT_FAILURE);
}

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connection failed");
exit(EXIT_FAILURE);
}

send(sock, message, strlen(message), 0);
printf("Message sent\n");
sleep(60);
// Abnormal connection termination
shutdown(sock, SHUT_RDWR);
close(sock);
return 0;
}

待续.........................

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 网络编程:从 Socket API 到极简 Redis 发布/订阅 sub/pub 服务的实现
本文旨在系统性地阐述 Linux 环境下的网络编程基础,重点关注 Socket 应用程序接口(API)的原理与应用。通过循序渐进的方式,结合具体的 C 语言代码示例,我们将剖析核心系统调用的机制,并最终构建一个基于传输控制协议(TCP)的简化版发布/订阅(Publish/Subscribe, Pub/Sub)服务器模型。
Piper破壳
2025/05/07
460
socket网络编程(六)——心跳包问题
问大家一个问题,如果客户端和服务端长时间没有相互发送数据的话,那么我们怎么来判断这个连接是否存在的呢?有些人可能很自然地说直接send一下不就可以了,确实可以这样进行判断,那么我们发送的时候可以选择发送任何东西,所以一般都是发送一个空包,这个就是心跳包。
一点sir
2024/01/10
4640
从零开始:Linux 网络基础到聊天室搭建
在拨号上网的时代,上网被看作一个通过与“互联网”这位朋友打电话的行为。这种信息建的交互形成网络,再按照一定规则协议,形成了套接字(Socket)。
花花Binki
2024/09/05
2630
从零开始:Linux 网络基础到聊天室搭建
入侵渗透专用的python小脚本
渗透的很多时候,在网上找到的工具并不适用,自己写代码才是王道,下面三个程序都是渗透时在网络上找不到合适工具,自己辛苦开发的红黑联盟,短小使用,求欣赏,求好评。
py3study
2020/01/06
9320
udp和tcp的区别
UDP(User Datagram Protocol)和 TCP(Transmission Control Protocol)是两种不同的传输层协议,它们在数据传输的可靠性、连接性、数据传输方式等方面有显著的区别。
ljw695
2025/02/03
960
我的赛博之路:跨越失业迷雾,于 IT 矩阵破茧成蝶
作为一名热爱IT行业的大学生,在踏入这个领域的那一刻起,我就被其魅力深深吸引。然而,随着学习的深入,外界关于 IT 行业 “失业”“吃青春饭” 的言论,如阴霾般不时笼罩着我,让我在敲代码的间隙常常陷入沉思。刚接触编程时,我被代码的魔力所震撼。简单的字符组合竟能创造出如此丰富多彩的世界,从控制台输出的 “Hello, World!” 到实现一个简单的计算器程序,每一次成功的运行都让我兴奋不已。但随着了解的深入,那些负面的声音开始让我心生忧虑。我会担心自己所学的知识在几年后就会过时,害怕自己在激烈的竞争中被淘汰,这种担忧就像一根刺,时不时刺痛着我追求梦想的心。
羑悻的小杀马特.
2025/04/25
950
我的赛博之路:跨越失业迷雾,于 IT 矩阵破茧成蝶
socket网络编程(五)——粘包拆包问题
假设一个这样的场景,客户端要利用send()函数发送字符“asd”到服务端,连续发送3次,但是服务端休眠10秒之后再去缓冲池中接收。那么请问10秒之后服务端从缓冲区接收到的信息是“asd”还是“asdasdasd”呢?如果大家有去做实验的话,可以知道服务端收到的是“asdasdasd”,为什么会这样呢?按正常的话,服务端收到的应该是“asd”,剩下的两个asd要不就是收不到要不就是下次循环收到,怎么会一次性收到“asdasdasd”呢?如果要说罪魁祸首的话就是那个休眠10秒,导致数据粘包了!
一点sir
2024/01/10
3430
socket网络编程(五)——粘包拆包问题
C与Python Socket性能比较
下面通过一个简单的 TCP Echo Server 示例来比较 C 和 Python 的实现。
华科云商小徐
2024/08/05
2300
select实现socket单线程多路复用
性能 select版本比阻塞版本的性能起码高了3倍+ # select版本 dhb@dev:~/下载/webbench-1.5$ webbench -c 1000 -t 30 http://127.0.0.1:1500/t Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. Benchmarking: GET http://127.0.0.1:1500/t 1
DH镔
2019/12/20
8000
VSCode原来也有中文版ChatGPT,神了!
START ---- hello,大家好!我是木荣君。最近比较火的ChatGPT着实令人眼前一亮。先来说一说ChatGPT是什么?ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务
Linux兵工厂
2023/03/30
5.6K0
VSCode原来也有中文版ChatGPT,神了!
Linux 学习必杀技:从菜鸟到高手的蜕变密码
踏入 Linux 奇幻世界,借 C++ 利刃,解锁文件、进程、网络等核心编程奥秘。附实用学习法与精选好书,助你从菜鸟一跃成 Linux 高手  。
羑悻的小杀马特.
2025/03/02
1470
使用C语言创建高性能爬虫ip网络
之前写的python和GO语言的爬虫ip池的文章引起很大反响,这次我将以C语言来创建爬虫IP池,但是因为其复杂性,可能代码并非完美。但是最终也达到的想要的效果。
华科云商小徐
2023/12/01
2110
socket网络编程(二)—— 实现持续发送
在《socket网络编程(一)——初识socket》一文里我们提到了,客户端发送了数据了之后,不管服务端还是客户端都close退出了,也就是说只能发送一次数据,这显然不符合实际的用途。那么该如何更改程序呢?
一点sir
2024/01/10
5390
socket网络编程(二)—— 实现持续发送
Linux原始系统api实现两个终端实时聊天
今天这篇文章基本上属于之前上学学习 c 语言的回顾了,要实现一个简单的聊天功能,其实还是需要话费一些代价的,这里面还是涉及到比较多的知识的。比如:
老码小张
2023/12/02
5260
Linux原始系统api实现两个终端实时聊天
论Linux进程间通信
在操作系统中,内核空间是所有进程共用的,而每个进程都拥有自己的用户空间。这种结构类似于一个公共图书馆,每个进程都有自己的阅读室”(用户空间),但它们都可以通过特定的走廊”(系统调用)访问这个图书馆(内核空间)。
小文要打代码
2025/03/04
1900
论Linux进程间通信
Linux网络编程之使用TCP传输文件
原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8976263,作者:gqb666
bear_fish
2018/09/20
2.8K0
TCP编程入门简介
在前几篇文章中,我们先从宏观角度(TCP 概述)大致介绍了 tcp 的概念,然后从微观角度(滑动窗口、拥塞窗口等)详细说明了从 client 端和 server 端,tcp 是如何进行网络控制的。在本文中,我们将通过一个 tcp 例子,将整个过程联通起来,讲解 tcp 从连接、发送以及关闭,整个流程是怎样运行的。
高性能架构探索
2022/08/25
3280
TCP编程入门简介
socket网络编程(一)——初识socket
出现一项技术,首先我们弄懂一下,为什么要出现。那么为什么要出现socket这玩意呢?可以很简单的用一句话来概括:
一点sir
2024/01/10
3980
socket网络编程(一)——初识socket
【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石
(或称为多任务I/O服务器)是一种高效管理多个I/O操作的技术,允许单线程或单进程同时监控和处理多个I/O事件(如网络套接字、文件描述符等)
IsLand1314
2025/04/03
880
端口复用(bind error: Address already in use 问题)
在前面讲解TCP状态转换中提到过一个2MSL等待时间,如果在通信过程中,server主动断开连接,那么server进程会处于TIME_WAIT状态并等待2MSL的时间,此时server进程还没终止,端口号port还被该进程占用呢,所以当server主动断开连接时,如果立即再次启动server,就会提示端口已经被使用,等待2MSL后才可以再次启动server。请看下图
mindtechnist
2024/09/17
4180
端口复用(bind error: Address already in use 问题)
相关推荐
Linux 网络编程:从 Socket API 到极简 Redis 发布/订阅 sub/pub 服务的实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验