伯克利套接字编程:循环服务器实现

需积分: 0 0 下载量 134 浏览量 更新于2024-08-19 收藏 612KB PPT 举报
"循环型服务员代码-CH8_Socket编程" 在计算机网络中,Socket编程是一种常见的用于进程间通信(IPC)的技术,特别是在分布式系统和网络应用中。它源自ARPA(高级研究计划署)的设计,并由UC Berkeley进一步发展,成为BSD Unix(伯克利软件包)的一部分,后来成为了事实上的标准。Socket API提供了跨不同操作系统和编程语言的通信接口。 Socket被定义为一个抽象的端点,允许应用程序通过操作系统控制与其他远程应用进程进行数据交换。在Unix系统中,最常用的Socket API是Berkeley Sockets,它使用C语言编写。而在Windows系统中,则有WINSOCK作为等价实现。 在给出的代码段中,展示了一个典型的循环型服务器(服务器端)的实现。这个服务器使用了以下Socket编程的关键步骤: 1. **创建Socket**:`socket()` 函数用于创建一个新的套接字。如果出错,如无法创建,`err_sys("socket error")` 将报告错误并退出程序。 2. **绑定Socket**:`bind()` 函数将创建的Socket与特定的IP地址和端口号关联。如果绑定失败,`err_sys("bind error")` 会处理错误。 3. **监听Socket**:`listen()` 函数使Socket进入监听模式,允许最多5个连接请求排队等待处理。如果监听失败,同样会报告错误。 4. **接受连接**:`accept()` 函数阻塞等待新的连接请求。一旦有客户端连接,它会返回一个新的Socket `newsockfd`,用于与该客户端的通信。如果接受连接出错,也会调用`err_sys()`。 5. **处理请求**:`doit(newsockfd)` 是一个未显示的函数,负责处理来自客户端的具体请求。处理完成后,关闭与客户端的连接,`close(newsockfd)`。 6. **无限循环**:服务器会持续运行,不断接受新的连接请求,重复上述过程。 在Socket编程中,还有一些关键概念: - **流(Stream)**:通常指的是TCP(传输控制协议)连接,提供面向连接、可靠的数据传输服务。 - **连接(Connection)**:建立客户端和服务器之间的双向通信管道。 - **阻塞(Block)与非阻塞(Non-block)**:决定Socket操作的等待行为。阻塞模式下,如果无数据可读或无法写入,函数会挂起;非阻塞模式下,这些操作会立即返回。 - **同步(Synchronous)与异步(Asynchronous)**:同步模式下,调用者等待操作完成;异步模式下,调用者不等待,操作完成后会收到通知。 - **IP地址(IPAddress)**:标识网络中的设备。 - **字节顺序(BytesOrder)**:网络传输中的字节顺序问题,如大端序和小端序。 - **带外数据(Out-of-band Data)**:TCP提供的一种特殊机制,允许发送紧急数据。 Socket编程涉及到的头文件,如`<sys/types.h>`和`<sys/socket.h>`,包含了必要的数据类型和函数定义。此外,还有其他函数用于获取或设置Socket的参数,如`getsockopt()`和`setsockopt()`,以及IP地址转换函数,如`inet_aton()`。 循环型服务员代码展示了如何构建一个简单的服务器,不断监听和处理来自客户端的连接请求。Socket编程的核心在于创建、绑定、监听、接受和通信,这些步骤构成了网络服务的基础框架。

void TRCustomUserAutoTest(void (*TestFunction)(void),AutoTestSet_t *TestSet) { time_t rawtime; time_t work_min=0,wait_min=0,current_min=0,start_min=0; //????? struct tm *timeinfo,startTime; unsigned char work_status=0,testing_point=0; //<??????>---------------------------------------------------------------- time(&rawtime); timeinfo=localtime(&rawtime); startTime.tm_mday=timeinfo->tm_mday;//???? startTime.tm_hour=timeinfo->tm_hour;//???? startTime.tm_min=timeinfo->tm_min; start_min=startTime.tm_hour*60+startTime.tm_min;//???????00:00 ?? work_min=0;//????????0 work_status=0; for(testing_point=0;testing_point<TestSet->pTemperature_point;) { DATALOG_MSG= "TEST" ; time(&rawtime); timeinfo=localtime(&rawtime); if(work_status==0) //?? { Temperature=TestSet->pTemperature_table[testing_point]; work_status=0x55;//???????? wait_min=work_min+TestSet->pTemperature_wait_table[testing_point]+TestSet->pWenDukeeptime; SOCKET_INC { JUDGE_VARIABLE(SOCKET,TestSet->pTemperature_table[testing_point],-100,0xFFFFFFF,"temperature"); JUDGE_VARIABLE(SOCKET,timeinfo->tm_hour*1000+timeinfo->tm_min*10,0,0xFFFFFFF,"heat_up_time"); } } else { work_status=0; testing_point++; wait_min=work_min+TestSet->pTesttime; SOCKET_INC { JUDGE_VARIABLE(SOCKET,timeinfo->tm_hour*1000+timeinfo->tm_min*10,0,0xFFFFFFF,"test_time"); } } while(work_min<wait_min) { WAIT(1000mS); time(&rawtime); timeinfo = localtime(&rawtime); //????????? if(timeinfo->tm_mday>=startTime.tm_mday) { current_min=(timeinfo->tm_mday-startTime.tm_mday)*1440; //??????? current_min=current_min+(timeinfo->tm_hour*60+timeinfo->tm_min); } else //???? { break; } work_min=current_min-start_min; } if(work_status!=0) { TestFunction();//?????? } } }

2023-05-18 上传