当前位置:
首页 >
Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
发布时间:2025/3/15
42
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
这两个选项分别用来设置socket接收数据和发送数据的超时时间,因此仅对于数据接收和发送相关的socket专用系统调用有效,,这些系统调用包括 send,sendmsg,recv,recvmsg ,accept 和connect.
在程序中,我们可以根据系统调用的返回值和errno来判断超时时间是否已到,进而觉得是否开始定时任务.
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <assert.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <string.h>int timeout_connect( const char* ip, int port, int time ) {int ret = 0;struct sockaddr_in address;bzero( &address, sizeof( address ) );address.sin_family = AF_INET;inet_pton( AF_INET, ip, &address.sin_addr );address.sin_port = htons( port );int sockfd = socket( PF_INET, SOCK_STREAM, 0 );assert( sockfd >= 0 );struct timeval timeout;timeout.tv_sec = time;timeout.tv_usec = 0;socklen_t len = sizeof( timeout );ret = setsockopt( sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, len );assert( ret != -1 );ret = connect( sockfd, ( struct sockaddr* )&address, sizeof( address ) );if ( ret == -1 ){if( errno == EINPROGRESS ){printf( "connecting timeout\n" );return -1;}printf( "error occur when connecting to server\n" );return -1;}return sockfd; }int main( int argc, char* argv[] ) {if( argc <= 2 ){printf( "usage: %s ip_address port_number\n", basename( argv[0] ) );return 1;}const char* ip = argv[1];int port = atoi( argv[2] );int sockfd = timeout_connect( ip, port, 10 );if ( sockfd < 0 ){return 1;}return 0; }总结
以上是生活随笔为你收集整理的Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: css3++
- 下一篇: RabbitMQ headers Exc