aix 是支持poll的,测试了一下,与预期相符。
server:
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/time.h>
//#include <unistd.h>
#include <poll.h>
/*
POLLIN date can be read
POLLRDNORM date can be read
POLLRDBAND priority date can be read
POLLPRI urgent date can be read
POLLOUT date can be write
POLLWRNORM date can be write
POLLWRBAND priority date can be write
POLLMSG used by sigpoll
POLLER error
POLLHUP descriptor hup up
POLLNVAL descriptor illegal
*/
int main (int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in serveraddr;
char buff[20];
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create error: %s(errno=%d)\n", strerror(errno), errno);
exit(0);
}
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(6789);
if(bind(listenfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) == -1)
{
printf("bind error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
if(listen(listenfd, 5) == -1)
{
printf("listen error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
if(fcntl(listenfd, F_SETFL, O_NONBLOCK) == -1)
{
printf("fcntl error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
int timeout;
int ret, i = 0, k = 0;
struct pollfd fds[6];
for(k = 0; k < 6; k++)
{
fds[k].fd = -1;
}
fds[i++].fd = listenfd;
fds[i-1].events = POLLIN;
while(1)
{
printf("i = %d\n", i);
ret = poll(fds, i, /*&timeout*/-1); // 0 return immediately
if(ret == -1)
{
printf("poll error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
else if(ret == 0)
{
printf("poll timeout error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
else
{
if(fds[0].revents & POLLIN)
{
int connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
if(connfd == -1)
{
printf("accept error: %s(errno=%d)\n",strerror(errno), errno);
}
else
{
if(i > 5)
{
printf("max connect num, close it\n");
close(connfd);
continue;
//exit(0);
}
printf("accept new socket\n");
if(fcntl(connfd, F_SETFL, O_NONBLOCK) == -1)
{
printf("fcntl error:connfd = %d, %s(errno=%d)\n",connfd, strerror(errno), errno);
exit(0);
}
for(k = 1; k < 6; k++)
{
if(fds[k].fd == -1)
{
printf("k = %d nn\n", k);
fds[k].fd = connfd;
fds[k].events = POLLIN;
i++;
break;
}
}
}
}
else
{
//printf("read ...\n");
for(k = 1; k < 6; k++)
{
if(fds[k].fd == -1)
continue;
//printf("k = %d\n", k);
if(fds[k].revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI | POLLERR))
{
int len = recv(fds[k].fd, buff, 20, 0);
if(len == -1)
{
printf("recv error:connfd = %d, %s(errno=%d)\n", connfd,strerror(errno), errno);
exit(0);
}
else if(len == 0)
{
printf("socket close\n");
close(fds[k].fd);
fds[k].fd = -1;
}
else
{
//buff[len] = '\0';
printf("recv data = %s, len = %d\n", buff, len);
memset(buff, 0, 20);
}
}
}
}
printf("one more time.\n");
}
}
for(i = 0; i < 7; i++)
{
if(fds[i].fd != -1)
close(fds[i].fd);
}
return 0;
}
client:
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
int sockfd;
char buff[20];
struct sockaddr_in serveraddr;
if(argc != 2)
{
printf("usage: ./client addr\n");
exit(0);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create error: %s(errno=%d)\n", strerror(errno), errno);
exit(0);
}
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(6789);
if(inet_pton(AF_INET, argv[1], &serveraddr.sin_addr) == -1)
{
printf("inet_pton error for %s\n", argv[1]);
exit(0);
}
if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) == -1)
{
printf("connect error: %s(errno=%d)\n", strerror(errno), errno);
exit(0);
}
printf("send data \n");
fgets(buff, 20, stdin);
if(send(sockfd, buff, strlen(buff), 0) == -1)
{
printf("send error: %s(errno=%d)\n", strerror(errno), errno);
exit(0);
}
close(sockfd);
return 0;
}
这个也没太多好说的,运行一下,没有问题。