C 套接字连接结束,此时正在对非阻塞套接字执行操作
我在使用connect()API连接到目标IP时遇到问题。connect()API返回一个C 套接字连接结束,此时正在对非阻塞套接字执行操作,c,linux,sockets,tcp,C,Linux,Sockets,Tcp,我在使用connect()API连接到目标IP时遇到问题。connect()API返回一个-1和一个errno作为正在进行的操作 。我是否在建立连接之前过早检查返回代码?请参阅以下代码段: struct sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(9190); const char * remoteIp = 10.1
-1
和一个errno作为正在进行的操作
。我是否在建立连接之前过早检查返回代码?请参阅以下代码段:
struct sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(9190);
const char * remoteIp = 10.10.20.86;
rc = inet_pton(AF_INET,remoteIp, &servAddr.sin_addr);
if (rc == -1 || errno == EAFNOSUPPORT)
{
return 0;
}
rc = connect(fd, (sockaddr*)&servAddr, sizeof(servAddr));
if ( rc < 0) // this is where it fails. rc is -1.
{
log("connect failure with [%s]",strerror(errno));
print_sock_connect_error();
}
servAddr中的结构sockaddr\u;
servAddr.sin_family=AF_INET;
servAddr.sinu port=htons(9190);
常量字符*remoteIp=10.10.20.86;
rc=inet\u pton(AF\u inet、remoteIp和servAddr.sin\u addr);
如果(rc==-1 | | errno==EAFNOSUPPORT)
{
返回0;
}
rc=connect(fd,(sockaddr*)&servAddr,sizeof(servAddr));
if(rc<0)//这就是它失败的地方。rc为-1。
{
日志(“与[%s]的连接失败”,strerror(errno));
打印_sock_connect_error();
}
我这里有两个问题:
10.10.20.86:9190
正在等待连接,一旦收到连接,就会将ack发送回源。我在pcap中看到tcp已建立—ACK、SYN/ACK和ACK to destination—但仍然无法理解它返回-1
时出错的原因。那么,在连接建立完成之前,我是否要检查rcsysctl net.ipv4.tcp\u syn\u retries
设置为6李>
EINPROGRESS
案例的方式,还是使用非阻塞套接字进行连接
从connect()
的Linux:
EINPROGRESS
套接字是非阻塞的,无法连接
立即完成。可以选择(2)或轮询(2)
通过选择要写入的套接字来完成。之后
选择(2)表示可写性,使用getsockopt(2)读取
SO_错误选项在SOL_套接字级别确定
connect()已成功完成(因此错误为零)或
未成功(因此,错误是常见的错误代码之一)
此处列出,解释失败的原因)
connect()
返回。由于您已将插座置于非阻塞模式,因此三路有线握手不可能在那时完成
sysctl net.ipv4.tcp_syn_retries设置为6
无关紧要
- 如果您希望在
返回之前连接完成或失败,请不要使用非阻塞模式connect()
- 如果要使用非阻塞模式,则必须使用
告诉您连接尝试何时完成。选择此选项可使套接字变为可写。(这并不一定意味着它已成为可写的:它意味着连接尝试已完成,结果可以通过select()
发现)getsockopt()/SO\u ERROR
errno
恰好是EAFNOSUPPORT
,则返回0
。如果没有错误(即,inet\u pton
不返回-1
),则errno
的值不确定且未知。那就别查了。