惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
P
Palo Alto Networks Blog
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
S
Schneier on Security
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
雷峰网
雷峰网
T
Tenable Blog
人人都是产品经理
人人都是产品经理
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Scott Helme
Scott Helme
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
Help Net Security
Help Net Security
Cloudbric
Cloudbric
C
Check Point Blog
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
腾讯CDC
量子位
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
Kaspersky official blog
Vercel News
Vercel News
F
Full Disclosure
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs

博客园 - Tiu

2010走了,又是一年,留个脚印 Commerce Server 2007 随笔一 2009眨眼间过去了,留个纪念 asp.net ajax随笔二 asp.net中慎用static全局变量 asp.net ajax随笔一 收集的关于依赖注入及Unity application block入门的一些资料 2008最后一篇:总结与展望 文件操作类简介 防止页面在提交的过程中多次点击按钮 第一次使用SQLCLR 装AJAX.NET 1.0的环境,我遇到个问题,进来解答下 关于邮件群发 XML学习一 asp.net窗中的两个Form问题 URL重写入门 动态从数据库中选择Top 个数 关于在数据层返回SqlDataReader 编写类和子程序的几个原则
C#网络编程随笔一
Tiu · 2007-04-12 · via 博客园 - Tiu

        最近在整网络编程的部分,以前从没有接触过,现在把学习过程中的一些体会写下来,这篇Blog是用Windows Live Writer写的,用的Google输入法,呵呵,测试下。

        在进行网络编程的时候,不可避免的要碰上多线程的问题。首先建立一个简单的服务器端,在一个单独的进程中进行监听本机的某一固定端口,先要声明一个IPEndPoint类的实例,构造函数为IP地址和端口号:

string hostname = Dns.GetHostName();
IPAddress[] address = Dns.GetHostAddresses(hostname);
IPEndPoint ipentry = new IPEndPoint(address[0], 1234);
txt_IpEntry.Text = ipentry.ToString();
listen = new TcpListener(ipentry);

listen.Start();下面是MSDN对TcpListener类的说明:

TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClient 或 Socket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。

Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。

然后就可以开启一个新线程进行阻塞式监听了:socket = listen.AcceptSocket();MSDN对AcceptSocket的说明:

AcceptSocket 是一个阻止方法,该方法返回可用于发送和接收数据的 Socket。如果希望避免阻止,请使用 Pending 方法来确定传入连接队列中的连接请求是否可用。

返回的 Socket 是使用远程主机的 IP 地址和端口号初始化的。您可以使用 Socket 类中任何可用的 Send 和 Receive 方法与远程主机进行通信。使用 Socket 后,请确保调用其 Close 方法。如果应用程序相对简单,请考虑使用 AcceptTcpClient 方法代替 AcceptSocket 方法。TcpClient 提供了一些通过网络在阻止同步模式下发送和接收数据的简单方法。

       当程序运行到这一步后,如果此时没有客户端请求,则当前线程进入阻塞状态,停在此处,直到客户端要进行发送连接请求时,AcceptSocket()方法返回套接字,然后执行下面的程序。

      根据自己反复实验跟踪,明白了一些东西,例如下面这段程序:

while (true)
{
socket = listen.AcceptSocket();
}

这个循环一开始以为每时每刻都在执行,后来经过单步调试得知,点击开始监听按钮时,此线程开启,然后执行到上面的语句后进入阻塞状态,一直等到客户端有连接请求,则得到套接字,程序继续向下执行,一旦建立连接后,客户端就可以与服务器端通信了,这时监听线程又停在了上面的那句程序那,进入阻塞状态,直到有新的客户端发送连接请求。