当前位置: 首页 > news >正文

中山好的做网站的公司新广告法 做网站的

中山好的做网站的公司,新广告法 做网站的,纵横天下网站开发,自己做的视频发什么网站一、优雅的断开套接字连接 之前套接字的断开都是单方面的。 #xff08;一#xff09;基于TCP的半关闭 Linux的close函数和windows的closesocket函数意味着完全断开连接。完全断开不仅不能发送数据#xff0c;从而也不能接收数据。在某些情况下#xff0c;通信双方的某一方…一、优雅的断开套接字连接 之前套接字的断开都是单方面的。 一基于TCP的半关闭 Linux的close函数和windows的closesocket函数意味着完全断开连接。完全断开不仅不能发送数据从而也不能接收数据。在某些情况下通信双方的某一方调用函数完全断开连接就很不优雅。 假设两台主机正在进行双向通信。主机A发完最后的数据调用close函数断开了连接之后主机A就无法接收主机B传输的数据。实际上是完全无法调用与接收数据有关的函数。最终由主机B传输的、主机A接收的数据也销毁了。 为了解决这种情况“只关闭一部分数据交换中使用的流“Half-close的方法就出来了。断开一部分连接是指可以传输数据但无法接收或者可以接收数据但无法传输。 二套接字和流 上一部分讨论的就是断开其中1个流。 三shutdown函数 shutdown()函数是用于关闭套接字的函数。它可以选择性地关闭套接字的读取或写入功能或者同时关闭两者。 函数原型如下 int shutdown(int sockfd, int how);参数说明 sockfd要关闭的套接字描述符。how关闭方式可以取以下值 SHUT_RD关闭读取功能即禁止从套接字中读取数据。SHUT_WR关闭写入功能即禁止向套接字写入数据。SHUT_RDWR同时关闭读取和写入功能。 返回值 成功关闭套接字返回0失败返回-1。 shutdown()函数通常与close()函数一起使用。shutdown()函数用于关闭连接而close()函数用于释放套接字描述符。关闭连接时可以根据需要选择关闭读取、写入或两者功能。 示例用法 #include sys/socket.h// 关闭套接字的读取功能 shutdown(sock, SHUT_RD);// 关闭套接字的写入功能 shutdown(sock, SHUT_WR);// 同时关闭套接字的读取和写入功能 shutdown(sock, SHUT_RDWR);注意事项 调用shutdown()函数后套接字无法再进行读取或写入操作但仍然可以通过close()函数来关闭套接字。如果套接字已经关闭通过close()函数则调用shutdown()函数将产生错误。shutdown()函数只是关闭套接字的读取或写入功能并不会真正断开连接。要完全断开连接需要调用close()函数释放套接字描述符。在网络编程中通常先调用shutdown()函数关闭套接字的读取或写入功能然后再调用close()函数关闭套接字。 为何要半关闭因为close函数调用之后会发送给对方EOF但此时无法接收到对方发送的数据。所以此时可以调用shutdown函数只关闭服务器的输出流半关闭这样就可以发送EOF同时保留了输入流接收对方数据。 四基于半关闭的文件传输程序 file_server.cpp #include iostream #include fstream #include cstring #include cstdlib #include unistd.h #include arpa/inet.h #include sys/socket.h#define BUF_SIZE 1024void error_handling(const char *message);int main(int argc, char *argv[]) {if (argc ! 2) {std::cout Usage: argv[0] port std::endl;exit(1);}int serv_sock, clnt_sock;char buffer[BUF_SIZE];int file_size, total_recv 0;struct sockaddr_in serv_adr, clnt_adr;socklen_t clnt_adr_sz;serv_sock socket(AF_INET, SOCK_STREAM, 0);if (serv_sock -1)error_handling(socket() error);memset(serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family AF_INET;serv_adr.sin_addr.s_addr htonl(INADDR_ANY);serv_adr.sin_port htons(atoi(argv[1]));if (bind(serv_sock, (struct sockaddr*)serv_adr, sizeof(serv_adr)) -1)error_handling(bind() error);if (listen(serv_sock, 5) -1)error_handling(listen() error);clnt_adr_sz sizeof(clnt_adr);clnt_sock accept(serv_sock, (struct sockaddr*)clnt_adr, clnt_adr_sz);if (clnt_sock -1)error_handling(accept() error);std::ifstream file(file.txt, std::ios::binary);if (!file) {error_handling(file open() error);}// 获取文件大小file.seekg(0, std::ios::end);file_size file.tellg();file.seekg(0, std::ios::beg);// 发送文件大小给客户端write(clnt_sock, file_size, sizeof(file_size));// 逐块读取文件内容并发送给客户端while (!file.eof()) {file.read(buffer, BUF_SIZE);int read_bytes file.gcount();write(clnt_sock, buffer, read_bytes);total_recv read_bytes;std::cout Sent total_recv bytes std::endl;}file.close();close(clnt_sock);close(serv_sock);return 0; }void error_handling(const char *message) {std::cerr message std::endl;exit(1); }file_client.cpp #include iostream #include fstream #include cstring #include cstdlib #include unistd.h #include arpa/inet.h #include sys/socket.h#define BUF_SIZE 1024void error_handling(const char *message);int main(int argc, char *argv[]) {if (argc ! 3) {std::cout Usage: argv[0] IP port std::endl;exit(1);}int sock;char buffer[BUF_SIZE];int file_size, total_recv 0;struct sockaddr_in serv_adr;sock socket(AF_INET, SOCK_STREAM, 0);if (sock -1)error_handling(socket() error);memset(serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family AF_INET;serv_adr.sin_addr.s_addr inet_addr(argv[1]);serv_adr.sin_port htons(atoi(argv[2]));if (connect(sock, (struct sockaddr*)serv_adr, sizeof(serv_adr)) -1)error_handling(connect() error);// 接收文件大小read(sock, file_size, sizeof(file_size));std::ofstream file(received_file.txt, std::ios::binary);if (!file) {error_handling(file open() error);}// 接收文件内容并写入本地文件while (total_recv file_size) {int recv_bytes read(sock, buffer, BUF_SIZE);total_recv recv_bytes;file.write(buffer, recv_bytes);std::cout Received total_recv bytes std::endl;}file.close();close(sock);return 0; }void error_handling(const char *message) {std::cerr message std::endl;exit(1); }五总结 1.解释TCP中”流“的概念。UDP中是否能形成流请说明原因 TCP的流是指两台主机通过套接字建立连接后进入可交换数据的状态也可称为”流形成的状态“。而对于UDP来说不存在流因为两个SOCKET不能相互连接。 2.Linux中的close函数或者windows中的closesocket函数属于单方面断开连接的方法有可能带来一些问题。什么是单方面断开连接什么情况下会出现问题 单方面的断开连接意味着套接字无法再发送数据。一般在对方有剩余数据未发送完成时断开己方连接会造成问题。 3.什么是半关闭针对输出流执行半关闭的主机处于何种状态半关闭会导致对方主机接收什么信息 半关闭是指只完成输入和输出流中的一个。而且如果对输出流进行半关闭EOF无法被传送到对方主机己方套接字无法传送数据但可以接收对方主机传送的数据。 二、域名及网络地址  一域名系统 1.什么是域名 域名Domain Name是互联网上用于标识和定位网站、服务器或其他网络设备的字符串。它是由一串字符组成用于代表特定的网络地址。域名的作用是将人们易于记忆的名称转换为计算机网络中的IP地址。因为在互联网上计算机之间通过IP地址进行通信而IP地址是一串数字不方便记忆和使用。通过使用域名用户可以使用易于记忆的名称来访问网站或进行其他网络操作而无需记住复杂的IP地址。 2.DNS服务器 DNSDomain Name System服务器是负责将域名解析为对应的IP地址的服务器。它是互联网基础设施中非常重要的组成部分提供了域名到IP地址之间的映射服务。 当用户在浏览器中输入一个域名时例如www.example.com浏览器会向本地的DNS服务器发送查询请求询问该域名对应的IP地址。本地DNS服务器首先查看自己的缓存如果有该域名的解析结果则直接返回给浏览器。如果缓存中没有本地DNS服务器会向根DNS服务器发出请求。根DNS服务器是全球DNS系统的顶级服务器负责指引查询请求到达下一级的DNS服务器它并不直接回答查询请求。根DNS服务器会告知本地DNS服务器负责该顶级域名的权威DNS服务器地址比如.com顶级域名的权威DNS服务器。本地DNS服务器再向权威DNS服务器发送查询请求。权威DNS服务器是负责管理特定域名区域的服务器它记录了该域名下所有主机的IP地址。权威DNS服务器将查询结果返回给本地DNS服务器然后本地DNS服务器将结果缓存并把查询结果发送给用户的浏览器。用户的浏览器接收到IP地址后便可以发起与该IP地址对应的服务器的通信进而访问到对应的网站或服务。 一个域名可以由多个DNS服务器负责解析这样可以提高系统的可靠性和性能。当一个DNS服务器无法解析时会尝试向其他可用的DNS服务器进行查询。 总结来说DNS服务器的主要功能是将域名解析为IP地址使用户可以使用易于记忆的域名来访问互联网上的各种服务和资源。 二IP地址和域名之间的转换 1.利用域名获取IP地址 2.利用IP地址获取域名 三、套接字的多种可选项 一套接字可选项和I/O缓冲大小 1.套接字多种可选项 套接字Socket是在网络编程中用于实现网络通信的一种抽象概念。它提供了一组可选项Options用于配置和控制套接字的行为和属性。以下是几种常见的套接字可选项 SO_REUSEADDR该选项用于设置套接字地址重用。当一个套接字关闭后该选项可以使之前绑定的地址立即可用于新的套接字。这对于服务器程序在重启后迅速重新监听同一个端口很有用。 SO_KEEPALIVE该选项用于启用或禁用套接字的保活功能。当启用时套接字会定期发送心跳消息以检测连接是否仍然有效。如果长时间没有收到对方的响应则认为连接已断开。 SO_SNDBUF和SO_RCVBUF这两个选项分别设置套接字的发送缓冲区大小和接收缓冲区大小。通过调整缓冲区大小可以优化数据传输的性能。 SO_LINGER该选项用于设置套接字关闭的行为。当设置SO_LINGER选项并指定一个非零的超时值时关闭套接字时会等待未发送完的数据发送完毕或超时后再关闭。如果超时值为0则表示立即关闭套接字不管是否还有未发送的数据。 TCP_NODELAY该选项用于禁用或启用Nagle算法。当禁用Nagle算法时套接字将立即发送所有数据而不会进行数据的合并和延迟发送。 这只是一些常见的套接字可选项实际上还有更多可选项可以用于配置和控制套接字的行为。具体可选项的使用方法和效果可以参考相关编程语言的文档或网络编程库的文档。 2.getsockopt setsockopt getsockopt和setsockopt是用于获取和设置套接字选项socket options的函数。这两个函数通常在网络编程中使用用于配置和控制套接字的各种属性和行为。 getsockopt函数用于获取套接字选项的当前值。它的原型如下 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);其中sockfd是套接字描述符level表示选项的协议层optname表示具体的选项名称optval是一个指向存放选项值的缓冲区的指针optlen是optval的大小。 setsockopt函数用于设置套接字选项的值。它的原型如下 int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);参数含义与getsockopt类似。不同之处在于optval是一个指向包含要设置的选项值的缓冲区的指针optlen表示optval的大小。 通过调用getsockopt和setsockopt函数可以对套接字进行各种配置。例如可以设置套接字的超时时间、缓冲区大小、重用地址选项等。具体可用的选项名称和取值范围取决于所使用的套接字库和操作系统。 需要注意的是不同的编程语言和套接字库可能提供了不同的接口和函数名称但基本的功能是相似的。因此在具体的编程环境中可以查阅相关文档以了解如何使用getsockopt和setsockopt函数进行套接字选项的获取和设置操作。 3.SO_SNDBUF  SO_RCVBUF SO_SNDBUF和SO_RCVBUF是用于设置套接字发送缓冲区大小和接收缓冲区大小的选项。 SO_SNDBUF选项用于设置套接字的发送缓冲区大小即发送数据时套接字可以暂存的最大数据量。该选项可以影响发送数据的性能和吞吐量。较大的发送缓冲区可以容纳更多的待发送数据减少了频繁的发送调用提高了发送效率。但是过大的发送缓冲区也可能会增加内存消耗。 设置SO_SNDBUF选项需要调用setsockopt函数并指定level为SOL_SOCKEToptname为SO_SNDBUF。示例代码如下使用C语言 int send_buffer_size 8192; // 设置发送缓冲区大小为8192字节 setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, send_buffer_size, sizeof(send_buffer_size));SO_RCVBUF选项用于设置套接字的接收缓冲区大小即接收数据时套接字可以暂存的最大数据量。该选项可以影响接收数据的性能和吞吐量。较大的接收缓冲区可以容纳更多的接收数据减少了频繁的接收调用提高了接收效率。但是过大的接收缓冲区也可能会增加内存消耗。 设置SO_RCVBUF选项需要调用setsockopt函数并指定level为SOL_SOCKEToptname为SO_RCVBUF。示例代码如下使用C语言 int recv_buffer_size 8192; // 设置接收缓冲区大小为8192字节 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, recv_buffer_size, sizeof(recv_buffer_size));值得注意的是实际的缓冲区大小可能会受到操作系统和套接字库的限制。在设置缓冲区大小时应该遵循合理的范围根据应用程序的需求和系统资源进行调整。需要同时设置发送和接收缓冲区大小时可以分别调用setsockopt函数进行设置。 二SO_REUSEADDR 1.发生地址分配错误Binding Error 当尝试在套接字上绑定地址时可能会发生地址分配错误Binding Error。这种错误通常意味着操作系统无法将所请求的地址分配给套接字。 地址分配错误可能有多种原因以下是一些常见的情况 地址已被占用如果所请求的地址已经被其他套接字或进程占用那么绑定操作将失败并返回地址分配错误。这可能是由于同一地址和端口已经被另一个套接字绑定或者是由于程序在之前运行中没有正确释放该地址。 权限不足如果当前用户没有足够的权限来绑定所请求的地址那么将会发生地址分配错误。在某些操作系统中只有超级用户root用户才有权利绑定低于1024的特殊端口号。 防火墙设置防火墙或安全策略可能会限制对某些地址或端口的访问从而导致无法进行绑定操作。请确保防火墙配置允许所需的地址和端口的访问。 地址格式错误如果提供的地址格式不正确或无效绑定操作将失败并引发地址分配错误。请确保使用正确的地址格式并正确地解析主机名或IP地址。 处理地址分配错误的方法可能因情况而异 可以尝试更换地址和端口号确保它们是可用且未被其他进程占用的。确保程序在使用完套接字后正确地关闭并释放相关资源这样可以避免出现地址被锁定或无法再次绑定的情况。检查权限设置并确保当前用户具有足够的权限来进行绑定操作。检查防火墙和网络安全策略并相应地配置以允许所需的地址和端口的访问。 如果问题仍然存在可能需要根据具体的错误消息和环境进行更详细的故障排除和调试。 2.Time-wait 状态 TIME_WAIT状态是TCP协议中的一个状态它在连接关闭后仍然存在一段时间。当TCP连接的一方主动关闭连接时会进入TIME_WAIT状态以确保在网络上所有的数据都能完全传输完成。 在TIME_WAIT状态下套接字不能立即重新使用相同的本地地址和端口号来建立新的连接。这是为了防止旧的重复分节被误认为是新的连接的分节。通常TIME_WAIT状态的持续时间为2倍的MSLMaximum Segment Lifetime。 TIME_WAIT状态的作用有以下几个方面 确保可靠性TIME_WAIT状态可以确保在网络中的所有分节都被正确发送和接收。这样可以避免旧的分节被误认为是新的连接的分节。 允许延迟分节到达在TIME_WAIT状态下如果对方还有未处理的分节它们可以继续到达并被正确处理。 允许最后的ACK分节到达在TIME_WAIT状态下对方可能会重新发送ACK分节以确保连接的正常关闭。 需要注意的是TIME_WAIT状态可能会对系统资源产生一定的负担。如果程序频繁地打开和关闭连接则可能耗尽可用的本地端口号。在某些情况下可以通过设置SO_REUSEADDR选项来允许立即重用处于TIME_WAIT状态的地址以便更快地重新建立连接。 对于开发者来说应注意以下几点 避免频繁关闭和重新打开连接尽量重用现有的连接。在程序设计中合理设置连接的生命周期避免不必要的TIME_WAIT状态的产生。理解并适当处理TIME_WAIT状态带来的影响例如通过调整操作系统的相关参数或使用SO_REUSEADDR选项。 3.地址再分配 地址再分配是指在网络编程中将一个已经使用过的地址重新分配给另一个套接字使用。 通常情况下当一个套接字关闭后其所使用的本地地址会进入TIME_WAIT状态一段时间。在这个时间内该地址无法立即被其他套接字重新使用。这是为了确保之前的连接的所有数据都能够完全传输完成并防止新的连接误认为是旧连接的分节。 然而在某些情况下可能需要在TIME_WAIT状态结束之前能够立即重新分配相同的本地地址。这时可以使用SO_REUSEADDR选项来实现地址再分配。 设置SO_REUSEADDR选项后处于TIME_WAIT状态的套接字地址就可以立即被其他套接字绑定和使用。这对于服务器程序在重启后快速重新监听同一个端口非常有用。 以下是使用C示例代码来设置SO_REUSEADDR选项进行地址再分配 #include iostream #include sys/types.h #include sys/socket.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, 0);// 设置SO_REUSEADDR选项int reuseaddr 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, reuseaddr, sizeof(reuseaddr));// 绑定地址和端口// ...return 0; }请注意虽然SO_REUSEADDR选项可以允许地址再分配但仍需注意以下几点 在设置SO_REUSEADDR选项之前确保套接字已经创建。使用SO_REUSEADDR选项时应谨慎处理连接的生命周期以避免出现意外的连接复用。还可能需要根据操作系统和网络环境的不同对其他参数或选项进行适当的调整以实现完全的地址再分配。 总而言之地址再分配可以通过设置SO_REUSEADDR选项来实现在合适的情况下可以提高程序的效率和可用性。但在使用时仍需谨慎考虑与设计并确保正确处理套接字的生命周期。 三TCP_NODELAY 1.Nagle算法 Nagle算法是一种用于减少小数据包传输的网络优化算法。它在TCP协议中起作用旨在减少网络拥塞和提高网络性能。 Nagle算法的原理如下 当发送应用程序有小量数据需要发送时Nagle算法会将这些数据收集到一个缓冲区中并等待一定时间通常是200毫秒。如果在等待时间内发送应用程序有更多的数据要发送那么这些数据会被追加到之前的数据后面。在等待时间结束后Nagle算法会将缓冲区中的数据封装成一个TCP分节并发送出去。 Nagle算法的目的是在发送方尽可能地减少小数据包的数量以避免网络中的拥塞。通过将小数据包合并成较大的数据块进行传输可以有效地利用网络带宽降低网络延迟提高传输效率。 然而Nagle算法也存在一定的副作用。由于需要等待一定时间或者达到一定的数据量才进行发送这会导致一些交互式应用程序的延迟增加。特别是对于需要实时响应的场景如实时游戏、语音/视频通话等Nagle算法可能不适合因为它会引入一定的传输延迟。 在实际的网络编程中可以通过设置TCP_NODELAY选项来启用或禁用Nagle算法。禁用Nagle算法后数据将立即发送适用于对实时性要求较高的应用程序。例如在C中使用setsockopt函数可以设置TCP_NODELAY选项 int flag 1; setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*)flag, sizeof(int));总的来说Nagle算法是一种优化网络传输的算法在某些场景下可以提高网络性能但在对实时性要求较高的应用程序中需要谨慎使用。  2.禁用Nagle算法 要禁用Nagle算法以便立即发送小数据包而不等待缓冲区填满或超时等待时间可以通过设置TCP_NODELAY选项来实现。禁用Nagle算法后数据将立即发送适用于对实时性要求较高的应用程序。 在网络编程中可以通过以下示例代码使用setsockopt函数来禁用Nagle算法使用C语言 #include iostream #include sys/types.h #include sys/socket.h #include netinet/tcp.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, 0);// 禁用Nagle算法int flag 1;setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, flag, sizeof(flag));// 进行其他操作...return 0; }上述代码中通过设置TCP_NODELAY选项为1来禁用Nagle算法。这样套接字上的数据将立即发送而不需要等待缓冲区填满或超时等待时间。 需要注意的是禁用Nagle算法可能会导致网络拥塞和传输效率降低因此在选择是否禁用Nagle算法时需要根据具体的应用场景进行权衡和考量。对于对实时性要求较高的应用程序禁用Nagle算法可能是一个合理的选择而对于需要减少小数据包传输的应用程序则可能需要启用Nagle算法以减少网络拥塞。 正确使用Nagle算法或禁用Nagle算法需要根据具体的需求和网络环境进行评估并根据实际情况进行适当的配置。
http://www.zqtcl.cn/news/305694/

相关文章:

  • 为什么网站要域名个人养老金制度最新消息
  • 公众号开发是不是网站开发公司网站建设分录
  • 云南省住房建设厅网站代理二级分销系统
  • 四川建设人才培训网站临沂网站制作页面
  • 用vue做网站建设工程合同属于什么合同
  • 赶集的网站怎么做广告投放报价
  • php 家政网站白嫖云服务器
  • 长春网站关键词推广优秀网站建设哪个公司好
  • php实战做网站视频教程站长工具网站测速
  • 当下网站建设常见的网址有哪些
  • 洪雅网站建设事业单位门户网站建设包含内容
  • 外网如何查看局域网建设的网站区块链开发工程师要求
  • 网站首页三张海报做多大怎么做网上直营店网站
  • 网站制作新手教程视频省建设厅网站安全生产标准化
  • 自动建设网站系统阿里云虚拟主机多网站
  • 区块链app排名网站seo其应用
  • 海口网站建设咨询一般网站建设需求有哪些方面
  • 免费网站建设朋友交流模板王网站
  • wordpress不同分类不同广告 文章属于不同分类网站 优化手机版
  • 淮安市建设银行网站首页王也是谁
  • 好用的网站管理系统给wordpress程序提速
  • 网页设计模板的网站网站开发包括哪些
  • 做网站的标准国外html5网站模板
  • 手机网站设计公司立找亿企邦郑州seo网络营销技术
  • 网站设计优秀作品网站开发的背景知识
  • 响应式网站建设流程温州网站优化案例
  • 谢岗镇网站建设上海的网吧
  • 厦门网站建设 智多星做印刷的有什么网站
  • 怎样做原创短视频网站wordpress文章加音频
  • 建设一个网站所需要注意的最有前途的15个专业