के बाद 0 को वापस लौटाएं जब मुझे लिनक्स सॉकेट प्रोग्राम पर काम किया गया तो मुझे चुनिंदा फ़ंक्शन के बारे में कोई समस्या है। चयन फ़ंक्शन ठीक काम करता है क्योंकि मैन पेज कहता है कि क्लाइंट सर्वर द्वारा कॉन्फ़िगर किए गए अंतराल में सर्वर पक्ष से कनेक्ट होता है। यदि टाइमआउट हुआ, तो चयन फ़ंक्शन हमेशा के लिए 0 लौटाएगा। उस समय, मैंने क्लाइंट को डीबग किया और क्लाइंट को सर्वर से कनेक्ट किया था। लेकिन चयन समारोह अभी भी 0 लौटा है। मैंने इस समस्या को खोज लिया है लेकिन कोई उपयोगी नहीं मिला। क्या कोई जान सकता है कि ऐसा क्यों चुना गया? मेरा लिनक्स संस्करण RHEL5.4 है। आपके सहयोग के लिए धन्यवाद।क्यों चुनें() हमेशा पहली बार
कोड नीचे दिखाया गया है।
static const int maxLog = 10000;
int main()
{
int servSock;
signal(SIGPIPE, SIG_IGN);
if((servSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket create fail\n");
exit(-1);
}
int val = 1;
if(setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))<0)
{
DieWithUserMessage("setsockopt error");
}
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(22000);
if(bind(servSock, (struct sockaddr *) &serverAddr,
sizeof(serverAddr)) < 0)
{
printf("socket bind fail\n");
exit(-1);
}
if(listen(servSock, maxLog) < 0)
{
printf("listen failed\n");
exit(-1);
}
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(servSock, &read_set);
int maxfd1 = servSock + 1;
std::set<int> fd_readset;
for(;;){
struct timeval tv;
tv.tv_sec = 5;
int ret = select(maxfd1, &read_set, NULL, NULL, tv);
if(ret == 0)
continue;
if(ret < 0)
DieWithUserMessage("select error");
if(FD_ISSET(servSock, &read_set))
{
struct sockaddr_in clntAddr;
socklen_t clntAddrlen = sizeof(clntAddr);
int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrlen);
if(clntSock < 0)
{
printf("accept failed()");
exit(-1);
}
maxfd1 = 1 + (servSock>=clntSock? servSock:clntSock);
FD_SET(clntSock, &read_set);
fd_readset.insert(clntSock);
}
}
}
सामान्य सलाह: चयन() के बजाय मतदान() का उपयोग करें। – Dummy00001
आपको 'select' –