`
aigo
  • 浏览: 2635799 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

用setsockopt()来控制recv()与send()的超时

阅读更多
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:
在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
这样做在Linux环境下是不会产生效果的须如下定义:struct timeval timeout = {3,0}; 
 
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
有两点注意就是
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
分享到:
评论

相关推荐

    setsockopt()设置socket方法

    使用 setsockopt() 函数可以设置发送和接收的超时时间。例如: int nNetTimeout=1000;// 1 秒 setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout, sizeof(int)); setsockopt(socket,SOL_SOCKET,SO...

    socket_recv函数使用心得.

    在 Windows 平台下,使用 winsock 函数时,recv 函数也会返回-1,但是如果没有设置超时,send 和 recv 函数都会堵住不动。 学习 socket_recv 函数需要了解其返回值的含义和使用场景,了解套接字的选项和多路复用 ...

    setsockopt函数一片不错的文章

    在网络环境不稳定时,`send()`和`recv()`可能会阻塞。通过`SO_SNDTIMEO`和`SO_RCVTIMEO`选项,可以设定发送和接收操作的超时时间,例如设置为1秒。这将限制等待数据传输的时间,防止程序无限制地等待。 4. **调整...

    TCP编程的服务器端一般步骤是:

    6. 收发数据,用函数 send() 和 recv(),或者 read() 和 write():在连接建立后,服务器可以与客户端进行数据交换,使用 send() 和 recv() 函数或 read() 和 write() 函数来发送和接收数据。 7. 关闭网络连接:在...

    winsocket 网络编程

    1. `send`与`recv`:在套接字连接建立后,使用`send`发送数据,`recv`接收数据。这两个函数是非阻塞的,可能需要循环调用来发送或接收整个消息。 2. 流量控制与拥塞控制:TCP通过滑动窗口机制实现流量控制,防止...

    TCP模板C语言代码(客户端)

    9. **阻塞与非阻塞**:默认情况下,`recv()` 和`send()` 在没有数据可发送或接收时会阻塞,可以使用`fcntl()` 或`setsockopt()` 设置套接字为非阻塞模式。 10. **套接字选项**:`setsockopt()` 函数可以设置套接字...

    嵌入式linux下的TCP文件传输

    在嵌入式Linux系统中,我们可以使用标准的C语言库函数`socket`、`connect`、`listen`、`accept`和`send`/`recv`来实现TCP通信。以下是客户端和服务器端的基本流程: 1. **服务器端**: - 创建套接字:使用`socket`...

    Windows Socket

    在阻塞模式下,当一个socket调用(如recv或send)被执行时,如果数据没有准备好或者发送缓冲区已满,该调用会暂停执行,直到操作完成或超时。这种模式确保了数据的完整性和顺序,因为程序会等待必要的条件满足后再...

    学学client/sever程序

    例如,使用setsockopt()函数可以设置超时时间,防止因网络问题导致的阻塞。此外,心跳机制可以检测连接状态,确保通信的可靠性。 总之,客户端/服务器程序设计涉及到网络通信、数据交换、安全性和并发处理等多个...

    tcp源代码.rar

    它通过建立三次握手建立连接,使用滑动窗口机制进行流量控制,通过确认、重传和超时策略实现拥塞控制,确保数据的准确无误传输。 2. **C语言编程** C语言是一种强大的系统级编程语言,常用于操作系统、设备驱动等...

    第4次Linux综合报告-终1

    此外,还可能包括错误处理机制,如使用setsockopt()设置超时时间,以及异常捕获来确保程序的健壮性。 实验报告还涵盖了学习态度、基础理论掌握程度、综合知识应用能力等多个评估指标,表明学生在学习过程中不仅掌握...

    应用TCPIP的套接字开发网络通信应用程序

    此外,为了调试和日志记录,可以使用`getsockopt`和`setsockopt`函数获取和设置套接字选项,如查看TCP连接状态,或者设置超时等。 总的来说,应用TCP/IP的套接字开发网络通信应用程序是一个涉及网络原理、Winsock ...

    c语言socket文件上传

    例如,使用`errno`和`perror()`检查和打印错误信息,或者使用`setsockopt()`设置超时。 9. **多线程编程**:为了处理多个并发连接,服务器端可能需要使用多线程。Linux提供了`pthread_create()`、`pthread_join()`...

    NEU计算机网络实验2,SOCKET 端口扫描以及 SOCKET 通信(聊天室) 本项目为客户端

    在实现过程中,客户端首先需要解析服务器的IP地址和端口号,然后调用socket()函数创建一个SOCKET实例,接着使用setsockopt()等函数设置必要的选项,如超时时间、重试次数等。bind()函数通常用于服务器端,但在此实验...

    vc下socket配套源码

    - `setsockopt`和`getsockopt`用于设置和获取Socket的选项,如超时、缓冲区大小等。 - `WSASend`和`WSARecv`是带有控制消息功能的发送和接收函数,可以处理更复杂的通信场景。 9. **错误处理**: - 在Socket编程...

    Linux下Socket编程

    2. Socket接口:Linux提供了丰富的Socket API供程序员使用,如socket()、bind()、listen()、accept()、connect()、send()、recv()等,它们构成了Socket编程的核心。 二、创建Socket 1. socket()函数:用于创建一个...

    TCP/IP可靠数据传输代码实现

    2. **错误检测与纠正**:TCP使用校验和来检查数据在传输过程中是否出错。如果接收端发现错误,它会通过发送一个否定确认(NAK)来要求重传。 3. **流量控制**:TCP通过滑动窗口机制来控制发送方的速率,防止数据...

    TCP.rar_linux tcp 客户端

    此外,TCP提供了许多可调整的参数,如窗口大小、超时时间等,可以通过`setsockopt()`函数进行设置,以优化性能或适应不同的网络环境。 文件`server.c`和`client.c`的实现可能还包括以下部分: 1. 数据包的封装和解...

    基于tcp的WinSock多点通信

    4. **套接字选项和控制消息**:使用`setsockopt()`和`getsockopt()`函数可以设置和获取套接字选项,以控制TCP的行为,例如设置超时、禁用Nagle算法等。`send()`和`recv()`函数可以配合控制消息来传递额外的信息,如...

    Socket开发资料

    可以使用setsockopt()设置Socket选项来优化性能,如设置超时时间、禁用Nagle算法等。 六、多线程与并发处理 为了处理多个客户端连接,服务器通常使用多线程或多进程模型,每个连接对应一个独立的线程或进程进行处理...

Global site tag (gtag.js) - Google Analytics