Linux 我对以下在POSIX中使用轮询函数的代码感到困惑
下面的代码是一个TCP服务器Linux 我对以下在POSIX中使用轮询函数的代码感到困惑,linux,Linux,下面的代码是一个TCP服务器 bool Run() { bool result = false; m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALIDE_SOCKET == m_Socket) { printf("Invalide socket..."); return result; } sockaddr_in servAddr
bool Run()
{
bool result = false;
m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALIDE_SOCKET == m_Socket)
{
printf("Invalide socket...");
return result;
}
sockaddr_in servAddr;
unsigned int sockAddrSize = sizeof(sockaddr_in);
bzero(&servAddr, sockAddrSize);
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(m_Port);
if (0 != bind(m_Socket, (sockaddr *)&servAddr, sockAddrSize))
{
printf("Can not bind socket addres to socket file...\n");
return result;
}
if (0 != listen(m_Socket, MAX_CONNECTION))
{
printf("Can not listen socket...\n");
return result;
}
printf("Server is stared. Please enter any key to continue...\n");
getchar();
system("clear");
m_Listener.Start();
m_DataReader.Start();
sockaddr_in temp;
while (true)
{
bzero(&temp, sockAddrSize);
int tempSocket = accept(m_Socket, (sockaddr *)&temp, &sockAddrSize);
if (-1 == tempSocket)
{
printf("accept is fialed...\n");
}
else
{
printf("A connection is established!\n");
}
//This is my intention:blocking after the client is connected and before the client to be send any data.
//When the client sends data, the program will print '---------------'.
pollfd tempTest;
tempTest.events = POLLRDNORM;
tempTest.revents = 0;
tempTest.fd = tempSocket;
int pollRes = poll(&tempTest, 1, -1);
if (pollRes == 1 && POLLRDNORM == tempTest.revents)
{
printf("-------------------\n");
}
}
return result;
}
事实上,当客户端连接到服务器并且不发送任何数据时,以下代码不符合我的意图,因为它也没有被阻止和打印“---------------”:
//This is my intention:blocking after the client is connected and before the client to be send any data.
//When the client sends data, the program will print '---------------'.
pollfd tempTest;
tempTest.events = POLLRDNORM;
tempTest.revents = 0;
tempTest.fd = tempSocket;
int pollRes = poll(&tempTest, 1, -1);
if (pollRes == 1 && POLLRDNORM == tempTest.revents)
{
printf("-------------------\n");
}
你看过手册了吗
您应该测试poll的结果
so代码:
fflush(NULL);
int res = poll(&test, 1, -1);
if (res < 0) {
perror("poll");
exit(EXIT_FAILURE); /// or some other error handling
};
printf("poll gave %d\n", res);
fflush(空);
int res=轮询和测试,1,-1);
如果(res<0){
佩罗(“投票”);
exit(exit_FAILURE);///或其他一些错误处理
};
printf(“投票结果为%d\n”,res);
顺便说一句,我会在轮询之前调用,我会打印poll
的结果,至少出于调试目的
您当然希望在成功的轮询后处理folfd.revents
;您应该特别注意它是POLLNVAL
还是POLLERR
你也应该进行同样的测试(你应该在poll
ing之前进行测试,看看,也许或者;我想这就是poll
失败或者说POLLNVAL
或者POLLERR
!)
阅读这显然不是你真正的代码。由于未定义folfd
,因此此文件甚至无法编译。请在所有错误情况下使用perror
。谢谢您的回答。我一直在消除困惑。