博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设置socket接收和发送超时的一种方式
阅读量:4966 次
发布时间:2019-06-12

本文共 2502 字,大约阅读时间需要 8 分钟。

Linux环境设置Socket接收和发送超时:
须如下定义: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));
 
另外常用的方式是使用select函数设置fd为读时间,并设置超时时间。
 
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern char *optarg;extern int optind, opterr, optopt;#include
#define LOG_ERROR my_printfint my_printf(char *fmt, ...){ char buffer[1024]; va_list argptr; int length = 0; va_start(argptr, fmt); length = vsnprintf(buffer,1024 ,fmt, argptr); va_end(argptr); printf("%s\n", buffer); return (length + 1);}int start_client(const char *host, int port, const char *local_host = NULL){ int client_socket = socket(AF_INET,SOCK_STREAM,0); if( client_socket < 0) { LOG_ERROR("Create socket failed, errno %d", errno); return -1; } //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; if(inet_aton(host,&server_addr.sin_addr) == 0) { LOG_ERROR("Server address inet_aton failed, errno %d!", errno); return -1; } if (local_host != NULL) { sockaddr_in client_addr; client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = inet_addr(local_host); if (bind(client_socket,(struct sockaddr*)&client_addr, sizeof(client_addr)) == -1) { LOG_ERROR("\nBind client failed, local_host %s, errno %d, %s\n", local_host, errno, strerror(errno)); close(client_socket); return -1; } } server_addr.sin_port = htons(port); socklen_t server_addr_length = sizeof(server_addr); //向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接 if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) { LOG_ERROR("Connect to %s:%d failed! error %d, %s", host, port, errno, strerror(errno)); close(client_socket); return -1; } // write(client_socket, "Hello Server", strlen("Hello Server")); return client_socket;}int main(){ int sock = 0; struct timeval timeout = { 3,0}; int tm = 0; int res = 0; char buf[1024]; sock = start_client("127.0.0.1", 5050); setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval)); tm = time(0); res = read(sock, buf, 1024); fprintf(stderr, "Read timeout %d\n", time(0) - tm); return 0;}

 

 

转载于:https://www.cnblogs.com/davad/p/4589786.html

你可能感兴趣的文章
jquery 对HTML标签的克隆、删除
查看>>
【Pandas】Pandas求某列字符串的长度,总结经验教训
查看>>
【转载】 Python动态生成变量
查看>>
WPF入门教程系列九——布局之DockPanel与ViewBox(四)
查看>>
用C写的俄罗斯方块游戏 By: hoodlum1980 编程论坛
查看>>
实现WMSservice的时候,出现边缘的点或icon被切断的情况
查看>>
使用ALAssetsLibrary读取所有照片
查看>>
杭州蓝松科技---短视频SDK介绍
查看>>
javascript你应该知道的七件事
查看>>
垃圾短信识别
查看>>
SOAP 1.1与SOAP 1.2的区别
查看>>
【AC自动机】Lougu P3796
查看>>
Java文件流的常见错误
查看>>
重载操作符
查看>>
用 SDL2 处理精灵图
查看>>
MySQL基础语法
查看>>
TextView淡入淡出效果
查看>>
30岁当下的困惑
查看>>
美国将会垄断互联网:为什么需要政府网关——一个技术人员的角度
查看>>
IdentityServer4【Topic】之定义客户端
查看>>