#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <memory.h>
#include <poll.h>
const static int POLL_SIZE = 1024;
const static int BUFFER_SIZE = 128;
int main()
{
//创建套接字
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
//创建结构体,填充字段
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);
//bind
if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
std::cout << "bind error!" << std::endl;
return -1;
}
listen(listenfd, 10);
int maxfd = listenfd;
char buffer[BUFFER_SIZE] = {0};
while(true)
{
struct pollfd fds[POLL_SIZE];
fds[listenfd].fd = listenfd;
fds[listenfd].events = POLLIN;
int nready = poll(fds, maxfd+1, -1);
if(nready == -1)
{
std::cout << "poll error !" << std::endl;
}
if(fds[listenfd].revents & POLLIN)
{
struct sockaddr_in clientaddr;
socklen_t clientlen;
int clientfd = accept(listenfd, (struct sockaddr*)&clientaddr, &clientlen);
fds[clientfd].fd = clientfd;
fds[clientfd].events = POLLIN;
if(clientfd > maxfd) maxfd = clientfd;
}
for(int i = listenfd+1; i < maxfd + 1; i++)
{
//读写事件
if(fds[i].revents & POLLIN)
{
int res = recv(i, buffer, BUFFER_SIZE, 0);
if(res == 0)
{
close(i);
memset(&fds[i], 0, sizeof(fds[i]));
}
else
{
buffer[res] = '\0';
printf("收到消息:%s", buffer);
send(i, buffer, res+1, 0);
fds[i].revents = 0;
}
}
}
}
return 0;
}
09-14
833
09-13
513
09-11
875
09-12
409
08-08