我有一個fd_set「write_set」,它包含我想用於發送(...)調用的套接字。當我調用select(maxsockfd + 1,NULL,& write_set,NULL,& tv)時,它總是返回0(超時),儘管我還沒有在write_set套接字上發送任何東西,並且應該可以發送數據。select()行爲是否具有可寫性?
這是爲什麼?在可以通過write_set中的套接字發送數據時,不應該立即選擇返回?
謝謝!
編輯:我的代碼..
// _read_set and _write_set are the master sets
fd_set read_set = _read_set;
fd_set write_set = _write_set;
// added this for testing, the socket is a member of RemoteChannelConnector.
std::list<RemoteChannelConnector*>::iterator iter;
for (iter = _acceptingConnectorList->begin(); iter != _acceptingConnectorList->end(); iter++) {
if(FD_ISSET((*iter)->getSocket(), &write_set)) {
char* buf = "a";
int ret;
if ((ret = send((*iter)->getSocket(), buf, 1, NULL)) == -1) {
std::cout << "error." << std::endl;
} else {
std::cout << "success." << std::endl;
}
}
}
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
int status;
if ((status = select(_maxsockfd, &read_set, &write_set, NULL, &tv)) == -1) {
// Terminate process on error.
exit(1);
} else if (status == 0) {
// Terminate process on timeout.
exit(1);
} else {
// call send/receive
}
當我進行測試的代碼運行它,如果我的插座實際上是在write_set,如果有可能在插座發送數據時,我得到一個「成功「......
你確定_maxsockfd正確嗎?它必須比任何read_set或write_set中的文件描述符大1。在上面的實際代碼中,你沒有_maxsockfd + 1,你在問題中做了什麼。 – nos 2011-05-21 12:19:58
-1代表C++代碼標記C.另外,用'_'前綴符號名稱幾乎總是錯誤的。 – 2011-05-21 12:24:51
@nos噢,是的,謝謝你。 – simon 2011-05-21 12:31:22