[英]In a non blocking socket in ssh daemon, select() always returns 1 after executing nmap script
在ssh守護程序中,select()總是正確返回,但是在執行以下nmap腳本后,
nmap -sV -O -A-腳本ssh2-enum-algos
即使未與ssh服務器建立連接,select()始終返回1。
還有其他幾個這樣的線程,但是我的代碼找不到問題。
我的代碼看起來像這樣,
while (1)
{
memcpy(tmp_read_set, read_set, sizeof(fd_set));
retValSS = select(FD_SETSIZE, tmp_read_set, NULL, NULL, NULL);
switch (retValSS)
{
case -1:
LOG1(CRIT, "select() failed, errno=%d", ipcom_errno);
goto cleanup;
case 0: // Timeout....
break;
default:
for(i=0; i<MAX_LISTEN_PORTS; i++)
{
if(lst_sock[i] == INVALID_SOCKET)
break;
if(FD_ISSET(lst_sock[i], tmp_read_set))
{
clt_sock = accept(lst_sock[i], NULL, NULL);
if (INVALID_SOCKET == clt_sock) /*INVALID_SOCKET is -1*/
{
LOG1(ERR, "accept() failed, errno=%d", errno);
continue;
}
if(srv_ctx->no_clients >= srv_ctx->max_clients)
{
LOG0(INFO, "max no of connected clients reached, disconnecting client");
close(clt_sock);
continue;
}
else
{
//some work is being done
}
}
}
}
}
我不斷收到錯誤日志,
accept()失敗,errno = 0
奇怪的是errno為0,表示沒有錯誤。 如果沒有錯誤,我認為accept()應該不會失敗。 有人可以解釋在哪種情況下accept()會失敗。
如果有人可以幫助我,我將非常感激。
您希望select()返回什么? 考慮一下select()通常用於等待多個文件描述符-如果您要連接兩個描述符,那么僅基於select的返回值,如何知道哪個成功/失敗? 您顯然不會。
這就是為什么select()僅僅告訴您哪些文件描述符已經過某種更改的原因,並且您應該獨立確定那是什么。 如果使用connect(),則應調用getsockopt()來檢索連接嘗試的結果。 請參閱此答案 ,其中解釋了如何執行無阻塞connect()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.