linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO
2014-04-13 00:43
453 查看
SO_RCVTIMEO和SO_SNDTIMEO ,它们分别用来设置socket接收数据超时时间和发送数据超时时间。
因此,这两个选项仅对与数据收发相关的系统调用有效,这些系统调用包括:send, sendmsg, recv, recvmsg, accept, connect 。
这两个选项设置后,若超时, 返回-1,并设置errno为EAGAIN或EWOULDBLOCK.
其中connect超时的话,也是返回-1, 但errno设置为EINPROGRESS
1. 代码:设置connect超时时间
参考:《linux高性能服务器编程》
因此,这两个选项仅对与数据收发相关的系统调用有效,这些系统调用包括:send, sendmsg, recv, recvmsg, accept, connect 。
这两个选项设置后,若超时, 返回-1,并设置errno为EAGAIN或EWOULDBLOCK.
其中connect超时的话,也是返回-1, 但errno设置为EINPROGRESS
1. 代码:设置connect超时时间
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <assert.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> //超时连接 int timeout_connect(const char *ip, int port, int time); int main(int argc, char **argv) { if (argc != 3) { fprintf(stderr, "Usage: %s ip port\n", 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; } int timeout_connect(const char *ip, int port, int time) { int ret = 0; int error; struct sockaddr_in address; bzero(&address, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(port); inet_pton(AF_INET, ip, &address.sin_addr); int sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd == -1) return -1; //超时时间 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); if (ret == -1) { error = errno; while ((close(sockfd) == -1) && (errno == EINTR)); errno = error; return -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; } char buffer[1024]; memset(buffer, '\0', 1024); ret = recv(sockfd, buffer, 1024, 0); printf("recv %d bytes, buf: %s\n", ret, buffer); return sockfd; }
参考:《linux高性能服务器编程》
相关文章推荐
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
- Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE
- Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE
- Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE
- linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
- java网络编程Socket中SO_LINGER选项的用法解读
- java网络编程Socket中SO_LINGER选项的用法解读
- Linux网络编程基础--socket常用选项
- linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
- java网络编程Socket中SO_LINGER选项的用法解读
- java网络编程Socket中SO_LINGER选项的用法解读
- socket网络编程中常用的SO_KEEPALIVE套接字选项
- 网络编程(10)—— 通过设置可选项取消socket的TImeWait状态以及开启Nagle算法
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
- linux网络编程中阻塞和非阻塞socket的区别
- Linux下Socket网络编程,文件传输,数据传输的C语言例子
- Linux下的socket编程实践(一) 网络基本知识以及 TCP/IP简述
- linux 网络编程之TIME_WAIT状态
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
- linux网络编程之 ─── socket概述