Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
生活随笔
收集整理的這篇文章主要介紹了
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++
- 下一篇: Linux下记录所有用户操作的脚本