现在的位置: 首页 > 综合 > 正文

select in socket

2014年02月07日 ⁄ 综合 ⁄ 共 2116字 ⁄ 字号 评论关闭

/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(int argc, char **argv)
{
 int i, maxi, maxfd, listenfd, connfd, sockfd;
 int nready, client[FD_SETSIZE];
 ssize_t n;
 fd_set rset, allset;
 char buf[MAXLINE];
 char str[INET_ADDRSTRLEN];
 socklen_t cliaddr_len;
 struct sockaddr_in cliaddr, servaddr;

 listenfd = socket(AF_INET, SOCK_STREAM, 0);

 bzero(&servaddr, sizeof(servaddr));
 servaddr.sin_family      = AF_INET;
 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 servaddr.sin_port        = htons(SERV_PORT);

 bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

 listen(listenfd, 20);

 maxfd = listenfd;  /* initialize */
 maxi = -1;   /* index into client[] array */
 for (i = 0; i < FD_SETSIZE; i++)
  client[i] = -1; /* -1 indicates available entry */
 FD_ZERO(&allset);
 FD_SET(listenfd, &allset);

 for ( ; ; ) {
  rset = allset; /* structure assignment */
  nready = select(maxfd+1, &rset, NULL, NULL, NULL);
  if (nready < 0) {
   perror("select error");
   exit(-1);
  }

  if (FD_ISSET(listenfd, &rset)) { /* new client connection */
   cliaddr_len = sizeof(cliaddr);
   connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);

   printf("received from %s at PORT %d\n",
    inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
    ntohs(cliaddr.sin_port));

   for (i = 0; i < FD_SETSIZE; i++)
    if (client[i] < 0) {
     client[i] = connfd; /* save descriptor */
     break;
    }
   if (i == FD_SETSIZE) {
    fputs("too many clients\n", stderr);
    exit(1);
   }

   FD_SET(connfd, &allset); /* add new descriptor to set */
   if (connfd > maxfd)
    maxfd = connfd; /* for select */
   if (i > maxi)
    maxi = i; /* max index in client[] array */

   if (--nready == 0)
    continue; /* no more readable descriptors */
  }

  for (i = 0; i <= maxi; i++) { /* check all clients for data */
   if ( (sockfd = client[i]) < 0)
    continue;
   if (FD_ISSET(sockfd, &rset)) {
    if ( (n = read(sockfd, buf, MAXLINE)) == 0) {
     /* connection closed by client */
     close(sockfd);
     FD_CLR(sockfd, &allset);
     client[i] = -1;
    } else {
     int j;
     for (j = 0; j < n; j++)
      buf[j] = toupper(buf[j]);
     write(sockfd, buf, n);
    }

    if (--nready == 0)
     break; /* no more readable descriptors */
   }
  }
 }
}
结果 打印:
received from 127.0.0.1 at PORT 60539

就一直在跑。 将客户端发的再返回给客户端。

抱歉!评论已关闭.