유닉스 네트워크 프로그래밍 - poll 모델 echo 서버
poll select 。
#include <iostream>
using namespace std;
#include <poll.h>
#include <limits.h>
#define OPEN_MAX 64
int main()
{
int i, maxi, listenfd, connfd, sockfd;
int nready;
ssize_t n;
socklen_t clilen;
struct pollfd client[OPEN_MAX];
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(10002);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
cout << "bind error" << endl;
return -1;
}
listen(listenfd, 5);
client[0].fd = listenfd;
client[0].events = POLLRDNORM;
for(int i = 1; i < OPEN_MAX; i++)
{
client[i].fd = -1;
}
maxi = 0;
cout << "startup sucess port : " << servaddr.sin_port << endl;
cout << "Max connect :" << OPEN_MAX << endl;
for(;;)
{
nready = poll(client, maxi + 1, -1);
if(nready == -1)
{
cout << "poll error" << endl;
}
if(client[0].revents & POLLRDNORM)//new client connection
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (sockaddr*)&cliaddr, &clilen);
for(i = 1; i < OPEN_MAX; i++)
{
if(client[i].fd < 0)
{
client[i].fd = connfd; //save des
break;
}
}
if(i == OPEN_MAX)
{
cout << "too many clients" << endl;
return -1;
}
client[i].events = POLLRDNORM;
if(i > maxi)
{
maxi = i;
}
if(--nready <= 0)
{
continue;
}
}
for(i = 1; i <= maxi; i++)
{
if((sockfd = client[i].fd) < 0)
{
continue;
}
if(client[i].revents & (POLLRDNORM | POLLERR))
{
char buffer[1024] = {0};
if((n = recv(sockfd, buffer, 1024, 0)) < 0)
{
if(errno == ECONNRESET)
{
//connection reset by client
close(sockfd);
client[i].fd = -1;
}
else
{
cout << "read error" << endl;
}
}
else if(n == 0)
{
//connect close by client
close(sockfd);
client[i].fd = -1;
}
else
{
send(sockfd, buffer, 1024, 0);
}
if(--nready <= 0)
{
break;
}
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.