设置超时在C connect()函数TCP套接字编程突破的recv() [英] Setting time out for connect() function tcp socket programming in C breaks recv()

查看:1344
本文介绍了设置超时在C connect()函数TCP套接字编程突破的recv()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的计划如果服务器不可达的连接功能花费​​太多时间。所以,我试着给超时使用select进行连接()。现在的问题是,当我尝试使用recvfrom的接收来自服务器的数据()我得到错误EAGAIN。这里是用来连接并从服务器接收数据code。

  INT袜子;
结构sockaddr_in的地址;
INT connectWithServer
{    INT状态;    timeval结构超时;
    timeout.tv_sec = 10;
    timeout.tv_usec = 0;    addr.sin_port = htons(端口);
    袜子=插座(AF_INET,SOCK_STREAM,0);
    inet_pton(AF_INET,服务器IP,和放大器; addr.sin_addr);    FD_SET设置;
    FD_ZERO(安培;设置);
    FD_SET(袜子,&安培;套);    的fcntl(袜子,F_SETFL,O_NONBLOCK);    如果((状态=连接(袜子,(结构sockaddr *)及地址,的sizeof(地址)))== -1)
    {
        如果(错误!= EINPROGRESS)
            返回状态;    }
    状态=选择(袜子+ 1,NULL,&安培;集,NULL,&安培;超时);    返回状态;
}
长整型receiveResponse(void *的响应,无符号整型长)
{
    socklen_t的sockLen = sizeof的(结构sockaddr);
    长整型接收= recvfrom的(袜子,响应,长度,0,(结构sockaddr *)及地址,和放大器; sockLen);
    的printf(收到%ld位元组...犯错%d个\\ N,收到错误号);    收到回报;
}


解决方案

  

设置超时在C connect()函数TCP套接字编程是不工作


校正。设置连接超时的的工作。什么不工作是后来的 recvfrom的(),那是因为你留在非阻塞模式插座,你不知道做什么用的做结果 EAGAIN。所以,要么搞定,使用选择()来告诉你何时套接字准备好读,否则将套接字回完成后,连接阻塞模式。

In my program If the server is not reachable the connect function take too much time. So i try to give time out to connect using select(). Now the problem is that when i try to receive data from server using recvfrom() i got error "EAGAIN". here is code used to connect and receive data from server.

int sock;
struct sockaddr_in addr;
int connectWithServer
{

    int status;

    struct timeval  timeout;
    timeout.tv_sec = 10;
    timeout.tv_usec = 0;

    addr.sin_port = htons(port);
    sock = socket (AF_INET,SOCK_STREAM,0);
    inet_pton(AF_INET,serverIP,&addr.sin_addr);

    fd_set set;
    FD_ZERO(&set);
    FD_SET(sock, &set);

    fcntl(sock, F_SETFL, O_NONBLOCK);

    if ( (status = connect(sock, (struct sockaddr*)&addr, sizeof(addr))) == -1)
    {
        if ( errno != EINPROGRESS )
            return status;

    }
    status = select(sock+1, NULL, &set, NULL, &timeout);

    return status;
}


long int receiveResponse (void *response , unsigned int length)
{
    socklen_t sockLen = sizeof(struct sockaddr);
    long int received = recvfrom(sock, response, length, 0,(struct sockaddr *)&addr,  &sockLen);
    printf("Received %ld bytes...  err %d\n",received, errno);

    return received;
}

解决方案

Setting time out for connect() function tcp socket programming in C is not working

Correction. Setting the connect timeout is working. What 'isn't working' is the subsequent recvfrom(), and that's because you left the socket in non-blocking mode and you don't know what to do with the resulting EAGAIN. So, either handle that, by using select() to tell you when the socket is ready to read, or else put the socket back into blocking mode after finishing the connect.

这篇关于设置超时在C connect()函数TCP套接字编程突破的recv()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆