服务端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <poll.h>
#include <sys/types.h>
#include <limits.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <time.h>
#include <errno.h>
#define ADDRESS "127.0.0.1"
#define PORT 1227
int main(int argc, char **argv)
{
int listenSocket;
listenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (listenSocket < 0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr, 0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
inet_pton(AF_INET, ADDRESS, &serveraddr.sin_addr.s_addr);
if (bind(listenSocket, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
{
perror("bind");
exit(-1);
}
if (listen(listenSocket, 200) < 0)
{
perror("listen");
exit(-1);
}
struct pollfd clients[1024];
clients[0].fd = listenSocket;
clients[0].events = POLLRDNORM;
for (int i = 1; i < 1024; ++i)
{
clients[i].fd = -1;
}
int maxi = 0;
while (1)
{
int readyNum = poll(clients, maxi + 1, -1);
if(clients[0].revents & POLLRDNORM)
{
printf("have client connect.\n");
int clientSocket;
clientSocket = accept(listenSocket, NULL, NULL);
if (clientSocket < 0)
{
perror("accept");
exit(-1);
}
int i;
for ( i = 1; i < 1024; ++i)
{
if(clients[i].fd == -1)
{
clients[i].fd = clientSocket;
clients[i].events = POLLRDNORM;
break;
}
}
if (i == 1024)
{
fprintf(stderr, "too many clients.\n");
close(clientSocket);
}
if (i > maxi)
{
maxi = i;
}
--readyNum;
if (readyNum == 0)
{
continue;
}
}
int sockfd;
char buf[1024];
for (int i = 1; i <= maxi; ++i)
{
if (clients[i].fd == -1)
{
continue;
}
if (clients[i].revents & (POLLRDNORM | POLLERR))
{
int n;
sockfd = clients[i].fd;
n = read(sockfd, buf, 1024);
if (errno == ECONNRESET)
{
close(sockfd);
clients[i].fd = -1;
}
else if (n == 0)
{
printf("have client close.\n");
close(sockfd);
clients[i].fd = -1;
}
else if (n < 0)
{
perror("read");
exit(-1);
}
else
{
printf("[%d]:%s", sockfd, buf);
write(sockfd, buf, n);
}
--readyNum;
if(readyNum == 0)
{
break;
}
}
}
}
}