【问题标题】:using select() in client socket program在客户端套接字程序中使用 select()
【发布时间】:2012-09-15 02:23:10
【问题描述】:

我试图用 C 编写一个服务器-客户端套接字程序。我有一个关于如何使用计时器实现它的问题。我要做的是在服务器和客户端之间建立连接并进行读写操作。我开始了解在服务器端使用带有“timeval”结构的 select()。但是我应该在客户端做什么,我可以在一个套接字上读取一段固定的时间。

【问题讨论】:

  • 您能否详细说明“在套接字上读取固定时间”的意思?您是否希望客户端仅在有限的时间内连接?或者您是否希望客户端在一段时间内没有收到任何内容时超时?

标签: c sockets


【解决方案1】:

你可以在客户端做同样的事情,在select()系统调用的timeval结构中设置你想要的超时时间。但是在客户端中,使用阻塞模式和使用setsockopt()SO_TIMEOUT/SO_RCVTIMEO 选项更容易,无论它在您的平台上调用什么来控制超时。查看相关的man页。

【讨论】:

    【解决方案2】:

    是的,如果您想要一个带有“setsockopt”的套接字的简短示例:

    int mySocket;
    struct timeval tv = {0, 0}; // Init to 0 (Or set directly with your values)
    
    mySocket = socket(AF_INET, SOCK_STREAM, 0);
    // Set the timeout (If you don't have set directly values)
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    // Set The Timeout On Socket RECV
    setsockopt(mySocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
    // Set The Timeout On Socket SEND
    setsockopt(mySocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));
    

    【讨论】:

    • //示例客户端代码 time_out.tv_sec = 15; // 15 秒 time_out.tv_usec = 0; // 0 毫秒 sockfd=socket(AF_INET,SOCK_STREAM,0); n=connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr)); fgets(缓冲区,255,标准输入); n=写(sockfd,缓冲区,strlen(缓冲区)); n=读取(sockfd,缓冲区,255);上面的示例代码是我正在尝试做的 - 连接到套接字“sockfd”上的服务器,首先执行写入操作,然后执行读取操作。 read() 必须等待 15 秒然后超时,但事实并非如此。需要帮助!
    • 好吧,我认为不要使用读/写而是发送/接收功能!? linux.die.net/man/2/sendlinux.die.net/man/2/recv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多