I/o复用问题:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 34561 #define MAX 100 const char * end="quit\n"; void err_quit(const char *s) { puts(s); exit(0); } int Max(const int a,const int b) { return a>b?a:b; } void str_cli(const int con,FILE *fp) { char sen[MAX],rec[MAX]; int num,maxfd,nread,flag=0; fd_set rset; __DARWIN_FD_ZERO(&rset); memset(sen, 0, MAX); memset(rec, 0, MAX); while(1) { /* 在这里要考虑一个问题,当服务器发送一个EOF信号过来我们的处理是关闭 还有就是客户端发送信号时候我们也应该要考虑到的是关闭写操作 */ __DARWIN_FD_SET(con, &rset); __DARWIN_FD_SET(fileno(fp), &rset); maxfd=Max(fileno(fp), con)+1; nread=select(maxfd, &rset, NULL, NULL, NULL); if(nread==0) { if(errno!=EINPROGRESS) return -1; } if(__DARWIN_FD_ISSET(con, &rset)) { num=(int)recv(con, rec, MAX, 0); rec[num]='\0'; fprintf(stdout, "recviev from server %s\n",rec); if(num<=0||num>MAX){ if(flag==1) return; else err_quit("server is termianted"); } } if(__DARWIN_FD_ISSET(fileno(fp), &rset)) { if(fgets(sen,MAX,fp)==NULL) { flag=1; shutdown(fileno(fp), SHUT_WR); __DARWIN_FD_CLR(fileno(fp), &rset); continue; } printf("\n"); send(con, sen, MAX, 0); if(strcmp(end, sen)==0) err_quit("client is over!"); } } } void setInitialServer(struct sockaddr_in * server) { bzero(server, sizeof(*server)); server->sin_family=AF_INET; server->sin_port=htons(PORT); server->sin_addr.s_addr=inet_addr("127.0.0.1"); } int Connection(const int A,const struct sockaddr *server ,socklen_t size) { int con; con=connect(A, server, size); if(con==-1) err_quit("connection is error"); return con; } int main(int argc, const char * argv[]) { // insert code here... struct sockaddr_in server,client; int sockfd; socklen_t len=sizeof(client); sockfd=socket(AF_INET, SOCK_STREAM, 0); if(sockfd==-1) err_quit("socket error!"); setInitialServer(&server); Connection(sockfd, (struct sockaddr *)&server, len); str_cli(sockfd, stdin); close(sockfd); return 0; }
select Server:
struct sockaddr_in server,clinet;
Client cli[__DARWIN_FD_SETSIZE];
fd_set rset,allset;
char rea[MAX];
int socked,num,conn,maxi,maxfd,i,nread,scok;
socklen_t len=sizeof(clinet);
bzero(&server, sizeof(server));
memset(rea,0,MAX);
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
socked=socket(AF_INET, SOCK_STREAM, 0);
if(socked==-1)
{
err_quit("socket error!");
}
if(bind(socked, (struct sockaddr*)&server, sizeof(server))==-1)
{
err_quit("bind error!");
}
if(listen(socked,LAN)==-1)
err_quit("listen error");
__DARWIN_FD_ZERO(&rset);
__DARWIN_FD_ZERO(&allset);
__DARWIN_FD_SET(socked, &allset);
maxi=-1;
maxfd=socked;
for(i=0;i<__DARWIN_FD_SETSIZE;i++)
{
cli[i].fd=-1;
}
while(1)
{
rset=allset;
nread=select(maxfd+1, &rset, NULL, NULL, NULL);
if(nread==0)
{
if(errno!=EINPROGRESS)
return -1;
}
if(__DARWIN_FD_ISSET(socked, &rset)){
conn=accept(socked, (struct sockaddr *)&clinet, &len);
if(conn<0)
{
if(errno==EINTR)
continue;
else
{
puts("error");
exit(0);
}
}
for(i=0;i<__DARWIN_FD_SETSIZE;i++)
if(cli[i].fd<0)
{
cli[i].fd=conn;
cli[i].client=clinet;
printf("the client's ip is %s,the id is %d\n",inet_ntoa(clinet.sin_addr),ntohs(clinet.sin_port));
memset(cli[i].data, 0, MAX);
break;
}
__DARWIN_FD_SET(conn, &allset);
if(i>maxi)
maxi=i;
if(conn>maxfd)
maxfd=conn;
if(i==__DARWIN_FD_SETSIZE)
err_quit("too many clients!");
if(--nread<=0)
continue;
}
for(i=0;i<=maxi;i++)
{
if((scok=cli[i].fd)<0)
continue;
if(__DARWIN_FD_ISSET(scok, &rset))
{
printf("test\n");
if((num=(int)read(scok,rea,MAX))==0)
{
close(scok);
printf("the client information %s\n",cli[i].data);
__DARWIN_FD_CLR(scok, &allset);
cli[i].fd=-1;
}
else
pro_str(cli[i], rea, MAX);
if(--nread<=0)
break;
}
}
}
poll server:
/*
struct pollfd{
int fd; 描述字符
short events; 调用值
short revents; 返回值
};
*/
struct pollfd polls[OPEN_MAX];
polls[0].events=POLLRDBAND;
polls[0].fd=sockfd;
for(i=1;i
maxi)
maxi=i;
if(--nready<=0)
continue;
}
for(i=1;i
0&&num