#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUF_LEN 1024
#define SERV_PORT 6000
#define FD_SIZE 100
#define MAX_BACK 100
int main(int argc, char ** argv)
{
int listenfd;
int connfd;
int sockfd;
int maxfd;
int maxi;
int i;
int nready;
int client[FD_SIZE];
int lens;
ssize_t n;
fd_set rset;
fd_set allset;
char buf[BUF_LEN];
socklen_t clilen;
struct sockaddr_in servaddr;
struct sockaddr_in chiaddr;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error: %d\n", errno);
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
printf("bind error: %d\n", errno);
exit(1);
}
if(listen(listenfd, MAX_BACK) == -1)
{
printf("listen error: %d\n", errno);
exit(1);
}
maxfd = listenfd;
maxi = -1;
for(i = 0; i < FD_SIZE; i++)
{
client[i] = -1;
}
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
while(1)
{
rset = allset;
if((nready = select(maxfd + 1, &rset, NULL, NULL, NULL)) == -1)
{
printf("select error: %d\n", errno);
exit(1);
}
if(nready <= 0)
{
continue;
}
if(FD_ISSET(listenfd, &rset))
{
clilen = sizeof(chiaddr);
printf("start doing ... \n");
if((connfd = accept(listenfd, (struct sockaddr *)&chiaddr, &clilen)) == -1)//connfd已连接套接口,listenfd监听套接口
{
printf("accept errno: %d\n", errno);
continue;
}
for(i = 0; i < FD_SIZE; i++)
{
if(client[i] < 0)
{
client[i] = connfd;
break;
}
}
if(i == FD_SIZE)
{
printf("too many ...\n");
close(connfd);
continue;
}
FD_SET(connfd, &allset);
if(connfd > maxfd)
{
maxfd = connfd;
}
if(i > maxi)
{
maxi = i;
}
}
for(i = 0; i <= maxi; i++)
{
if((sockfd = client[i]) > 0)
{
if(FD_ISSET(sockfd, &rset))
{
memset(buf, 0, sizeof(buf));
n = read(sockfd, buf, BUF_LEN);
if(n < 0)
{
printf("read client errno\n");
close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
continue;
}
if(n == 0)
{
printf("no data\n");
close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
continue;
}
printf("server recv: %s\n", buf);
if(strcmp(buf, "q") == 0)
{
close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
continue;
}
printf("server send: %s\n", buf);
write(sockfd, buf, n);
}
}
}
}
return 0;
}
select服务端代码实现
最新推荐文章于 2023-09-19 15:56:25 发布