设置socket接收和发送超时的一种方式

简介: 设置socket接收和发送超时的一种方式

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 <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <thread>
#include <unistd.h>
extern char *optarg;
extern int optind, opterr, optopt;
#include <getopt.h>
#define LOG_ERROR my_printf
int 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;
}
目录
相关文章
|
6月前
|
存储 Python
Python网络编程基础(Socket编程) UDP 发送和接收数据
【4月更文挑战第10天】对于UDP客户端而言,发送数据是一个相对简单的过程。首先,你需要构建一个要发送的数据报,这通常是一个字节串(bytes)。然后,你可以调用socket对象的`sendto`方法,将数据报发送到指定的服务器地址和端口。
|
6月前
|
网络协议 Python
python中socket客户端发送和接收数据
【4月更文挑战第7天】本教程聚焦TCP客户端数据发送与接收。使用Python的`socket`模块,通过`send()`发送字节串至服务器,如`client_socket.send(message_bytes)`;用`recv()`接收数据,如`received_data = client_socket.recv(buffer_size)`。异常处理确保网络错误时程序健壮性,例如`try-except`捕获`socket.error`。理解和掌握这些基础操作对于构建稳定的TCP客户端至关重要。
1388 1
|
3月前
|
网络协议 数据格式 Python
python Socket无限发送接收数据方式
Socket是指套接字,是对网络中不同主机上的应用进程之间进行双向通信的端点的一种抽象。 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
|
3月前
|
JavaScript 前端开发 Ubuntu
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
62 0
|
5月前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送&quot;Hello, Server!&quot;后关闭。注意Android中需避免主线程进行网络操作。
105 4
|
6月前
|
设计模式 监控 网络协议
socket通信处于网络协议那一层和两种接收发送消息方式
socket通信处于网络协议那一层和两种接收发送消息方式
87 2
|
6月前
|
监控 网络协议 数据安全/隐私保护
手机socket套接字75秒超时问题及解决方案
手机socket套接字75秒超时问题及解决方案
89 0
|
6月前
|
存储 Python
Python网络编程基础(Socket编程)接收和发送数据
【4月更文挑战第9天】在UDP服务器编程中,我们已经创建了一个UDP套接字并绑定了地址和端口。接下来,服务器需要能够接收来自客户端的数据,并能够对这些数据进行处理和响应。下面,我们将详细讲解如何在UDP服务器中接收和发送数据。
|
6月前
C++socket客户端select异步连接发送接收数据
C++socket客户端select异步连接发送接收数据
105 0
|
6月前
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
下一篇
无影云桌面