struct timeval{
long tv_sec; /*秒 */
long tv_usec; 微秒 */
}
#include <sys/select.h>
int FD_ZERO(int fd,fd_set *fdset);
int FD_CLR(int FD_SET(fd_set);
int FD_ISSET(二、TCP服务端代码
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include "wrap.h"
#define MAXLINE 80
#define SERV_PORT 8001
int main(int argc,char **argv)
{
int i,maxi,maxfd,listenfd,connfd,sockfd;
nready,client[FD_SETSIZE];
ssize_t n;
fd_set rset,allset;
char buf[MAXLINE];
str[INET_ADDRSTRLEN];
socklen_t cliaddr_len;
sockaddr_in
cliaddr,servaddr;
listenfd = Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,1)">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,1)">(servaddr));
Listen(listenfd,20);
maxfd = listenfd;
maxi = -1;
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);
if (nready < )
perr_exit(select error");
if (FD_ISSET(listenfd,&rset)) { new client connection
cliaddr_len = (cliaddr);
connfd = Accept(listenfd,(struct sockaddr *)&cliaddr,1)">cliaddr_len);
printf(received from %s at PORT %dn,inet_ntop(AF_INET,&cliaddr.sin_addr,str,1)">(str)),ntohs(cliaddr.sin_port));
)
if (client[i] < ) {
client[i] = connfd; save descriptor */
break;
}
if (i == FD_SETSIZE) {
fputs(too many clientsn);
}
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 == continue; no more readable descriptors
}
0; i <= maxi; i++) {
check all clients 714 for data if ( (sockfd = client[i]) < continue;
if (FD_ISSET(sockfd,1)">rset)) {
if ( (n = Read(sockfd,buf,MAXLINE)) == ) {
Close(sockfd);
FD_CLR(sockfd,1)">allset);
client[i] = -;
} else {
j;
for (j = 0; j < n; j++)
buf[j] = toupper(buf[j]);
Write(sockfd,n);
}
)
break;
}
}
}
}
?
备:封装原始linux函数wrap.c:
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <
#include <unistd.h>
void perr_exit(const char *s)
{
perror(s);
exit();
}
int Accept(struct sockaddr *sa,socklen_t *salenptr)
{
n;
again:
if ((n = accept(fd,sa,salenptr)) < ) {
if ((errno == ECONNABORTED) || (errno == EINTR))
goto again;
perr_exit(accept error);
}
return n;
}
void Bind(struct sockaddr *sa,socklen_t salen)
{
if (bind(fd,salen) < )
perr_exit(bind errorvoid Connect(if (connect(fd,1)">connent errorvoid Listen( backlog)
{
if (listen(fd,backlog) < )
perr_exit(listen errorint Socket(int family,1)">int type,1)"> protocol)
{
n;
if ((n = socket(family,type,protocol)) < socket error);
n;
}
ssize_t Read(void *ptr,size_t nbytes)
{
ssize_t n;
again:
if ((n = read(fd,ptr,nbytes)) < if (errno == EINTR)
else
return -;
}
n;
}
ssize_t Write(if ((n = write(fd,nbytes)) == -void Close( fd)
{
if (close(fd) == -close error);
}
ssize_t Readn(vptr,size_t n)
{
size_t nleft;
ssize_t nread;
ptr;
ptr = vptr;
nleft =while (nleft > if ((nread = read(fd,nleft)) < EINTR)
nread = else
;
} else if (nread == ;
}
nleft -= nread;
ptr += nread;
}
return n - nleft;
}
ssize_t Writen(if ((nwritten = write(fd,nleft)) <= if (nwritten < 0 && errno == EINTR)
nwritten = ;
}
nleft -= nwritten;
ptr += nwritten;
}
static ssize_t my_read(ptr)
{
static read_cnt;
read_ptr;
char read_buf[100];
if (read_cnt <= ) {
again:
if ((read_cnt = read(fd,read_buf,1)">sizeof(read_buf))) < EINTR)
again;
if (read_cnt == )
return ;
read_ptr = read_buf;
}
read_cnt--;
*ptr = *read_ptr++;
}
ssize_t Readline(char c,* vptr;
for (n = 1; n < maxlen; n++if ((rc = my_read(fd,&c)) == ) {
*ptr++ = c;
if (c == 'n')
if (rc == ) {
*ptr = return n - {
;
}
}
*ptr = n;
}
?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!