connect()不会返回

时间:2013-11-26 11:58:27

标签: c++ linux sockets

我想简单地连接到服务器并获得响应。我的程序是用c ++编写的,你可以在这里看到代码:

if((interpreterSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    return SOCKETERR;
}

fcntl(interpreterSocket, F_SETFD, FD_CLOEXEC);
setsockopt(interpreterSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &flag, sizeof(flag));
setsockopt(interpreterSocket, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag));
setsockopt(interpreterSocket, SOL_SOCKET, SO_REUSEADDR , (char *) &flag, sizeof(flag));

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(INTERPRETERADDR); 
address.sin_port = htons(INTERPRETERPORT);
adlen = sizeof(address);

if((rc = connect(interpreterSocket, (struct sockaddr *) &address, adlen)) < 0)
{
     close(interpreterSocket);
     return SOCKETERR;
}

问题是当我运行这个程序时有时它有一些麻烦,所以我必须杀死这个过程。之后,当我运行程序时,connect函数不会返回,程序在if行停止。我认为这个问题大多与套接字没有以适当的方式关闭。

我应该提一下,我在CentOS中运行这个程序。

提前致谢。

修改

我还有一个问题,导致程序在connect()函数处停止,这是服务器上的一些路由问题。

1 个答案:

答案 0 :(得分:1)

您正在使用阻塞套接字,因此请连接阻塞,直到它连接到服务器或超时传递。要将套接字设置为非阻塞,您应该使用ioctlsocket函数,完全使用FIONBIO命令作为第二个参数。

注意当您将套接字设置为非阻塞时,您应该开始使用select函数来读取或写入套接字。

修改

抱歉,我忘了那是关于Linux的。通过使用fcntl在套接字文件描述符上设置O_NONBLOCK标志,可以在套接字上执行非阻塞I / O.