c++ - connect() 不返回

标签 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() 函数处停止,这是服务器上的一些路由问题。

最佳答案

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

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

编辑

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

关于c++ - connect() 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216462/

相关文章:

c++ - CRTP - 从基类检查派生类是否满足要求

c++ - 读取/写入流时丢失数据

linux - BASH - 找不到什么 $?特殊变量手段

python - 是否可以在 Windows 上部署 Python AWS Lambda?

c++ - 你如何循环读取 C++ 套接字?

c++ - 隐式字段初始化规则

c++ - std::logical_not 和 std::not1 之间的区别?

linux - Unix命令获取没有基本名称的文件路径

java - Java UDP中如何获取实际数据包大小 `byte[]`数组

c++ - ZeroMQ 无法通过单播 IPv6 工作