您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

摘要:简介 Socket(套接字)是计算机网络中的一套编程接口,是网络编程的核心,它将复杂的网络协议封装为简单的API,是应用层(HTTP)与传输层(TCP)之间的桥梁。 应用程序通过调用Socket API,比如connect、send、rec
简介 Socket(套接字)是计算机网络中的一套编程接口,是网络编程的核心,它将复杂的网络协议封装为简单的API,是应用层(HTTP)与传输层(TCP)之间的桥梁。 应用程序通过调用Socket API,比如connect、send、recv,无需处理IP包封装,路由选择等复杂网络操作,屏蔽底层细节将网络通信简化为建立连接-数据接收-数据发送-连接断开,降低了开发复杂度。 FD&Handle FD 文件描述符,在linux系统中,一切皆文件,它是内核为了管理已打开的文件,而给每个进程维护的一个文件描述符表,而FD就是一个文件的索引。 Handle 而在windows平台下,这个概念被称为Handle(句柄),都为应用程序提供了一种统一的方式来访问和操作资源,隐藏了底层资源管理的复杂性。 FD主要用于标识文件、套接字、管道等输入输出资源;而Handle的应用范围更广,除了文件和网络资源外,还可以用于标识窗口、进程、线程、设备对象等各种系统资源。 Socket 网络模型 BIO,Blocking I/O BIO 是最传统的 I/O 模型,其核心特征是一个连接一个线程,线程在读取/写入时会阻塞,直到I/O操作完成。 private static Socket _server; private static byte[] _buffer = new byte[1024 * 4]; static void Main(string[] args) { _server=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); _server.Bind(new IPEndPoint(IPAddress.Any, 6666)); _server.Listen(); while (true) { //BIO核心,线程阻塞,等待客户端连接 var client = _server.Accept(); Console.WriteLine($"Client {client.RemoteEndPoint} connect. "); //BIO核心,线程阻塞,等待客户端发送消息 var messageCount = client.Receive(_buffer); var message = Encoding.UTF8.GetString(_buffer, 0, messageCount); Console.WriteLine($"Client {client.RemoteEndPoint} Say:{message}"); } } 从代码中可以看出,有两个地方阻塞,一是Accept(),二是Receive(),如果客户端一直不发送数据,那么线程会一直阻塞在Receive()上,也不会接受其它客户端的连接。 C10K问题 有聪明的小伙伴会想到,我可以利用多线程来处理Receive(),这样就服务端就可以接受其它客户端的连接了。
阅读全文