⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 131.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="126.htm">上一层</a>][<a href="132.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>

标  题: 关于SOCKET编程SELECT使用问题(转载) <br>

发信站: UNIX编程 (2001年09月19日19:22:03 星期三), 站内信件 <br>

  <br>

:标题   关于SOCKET编程SELECT使用问题 <br>

:作者 room_hj (stranger ) <br>

:时间 04/18/01 04:55 PM <br>

  <br>

问题: <br>

在LINUX6编写一个C/S通讯程序过程中,出现如下情况============================= <br>

=========== <br>

服务端SOCKET采用阻塞模式,采用如下SELECT,具体如下: <br>

int sockfd;//监听客户连接的SOCKET <br>

int userfd[20];//用于和不同客户连接的SOCKET <br>

fd_set readfds;//用于所有SOCKET集合 <br>

........ <br>

listen(sockfd,20); <br>

FD_ZERO( &readfds); <br>

FD_SET( sockfd, &readfds); <br>

for ( k=0;k<=num;k++) <br>

FD_SET( userfd[k], &readfds); <br>

while(1) <br>

{ maxfd=最大的描述符; <br>



select(maxfd+1,&readfds,NULL,NULL,NULL); <br>

if ( FD_ISSET( sockfd, &readfds)) //如果是新客户端 <br>

{ printf("new connect"); <br>

num++; <br>

namelen=sizeof(server); <br>

if((userfd[num]=accept(sockfd,&server,&namelen))<0) <br>

{ <br>

perror("accept"); <br>

exit(4); <br>

} <br>

printf("server: got connection from %s\n",inet_ntoa(server.sin_addr)); <br>

} <br>

if (FD_ISSET(userfd[k], &readfds))//如果是在线用户。。。 <br>

} <br>

问题: <br>

我的客户端连接无法生效,即一个新用户进入后在服务端没有进入 if ( FD_ISSET( so <br>

ckfd, &readfds)) 的判断中,我怀疑是SELECT没有发生作用,或者FD_ISSET没有作用。 <br>

  <br>

请大家指教! <br>

  <br>

:标题   Re: 关于SOCKET编程SELECT使用问题 [re: code] <br>

:作者 room_hj (stranger ) <br>



:时间 04/19/01 01:51 PM <br>

谢谢EJIAN兄,我的问题已经解决,程序是别人写的,我是查看问题所在,原来是SELEC <br>

T的第一个参数nfds,我的那位同事没有在第一次监视过程中将LISTEN SOCKET值设为最大 <br>

值。 <br>

增加语句:maxfd=sockfd;即可。为感谢大家的光顾,将这个小程序贴出来。 <br>

/******cpserver.c******/ <br>

# include <sys/types.h> <br>

# include <sys/socket.h> <br>

# include <netinet/in.h> <br>

# include <netdb.h> <br>

# include <stdio.h> <br>

# include <unistd.h> <br>

# include <time.h> <br>

//define some general viriables <br>

//log file 50! <br>

//record file 100! message <br>

void gettime(); <br>

int num=0;//num为客户端socket数组专用… <br>

int number;//number是特定客户端数组socket号… <br>

char history[20]; //询问历史信息记录文件名… <br>

int userfd[20]; //很有用的… <br>

char *id[20]; //标明该用户地址… <br>



char timenow[25]; //标明此时服务器时间… <br>

char today[8]; //例如:20010412… <br>

char todayinfo[13]; //信息记录文件名… <br>

char todaylog[12]; //操作日志文件名… <br>

char message[46]; //发送信息数组… <br>

int inspect[20]; <br>

char infofromclient[50];// his,msg info comes here! <br>

int fd1,fd2,fd; //record文件…log文件…history文件…! <br>

main() <br>

{ <br>

int sockfd,maxfd=1;//sockfd is the socket for listening,maxfd is the max num <br>

ber of socket <br>

fd_set readfds;//readfds is the collection of the client sockets <br>

char showin[29]; //showin!!!!!!! <br>

int k; <br>

int i; <br>

int port; <br>

struct sockaddr_in server; <br>

char request[3]; <br>

int namelen; <br>

/******************* realcode here ***********************/ <br>

for (k=1;k<=19;k++) <br>



inspect[k]=1; //to make the out off!! <br>

sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); <br>

if(sockfd<0) <br>

{ <br>

perror("socket"); <br>

exit(1); <br>

} <br>

server.sin_family=AF_INET; <br>

server.sin_addr.s_addr=INADDR_ANY; <br>

server.sin_port=htons(3333); <br>

if(bind(sockfd,&server,sizeof(server))<0) <br>

{ <br>

perror("bind"); <br>

exit(2); <br>

} <br>

printf("bind ok\n"); //+++++++++++++++temp+++++++++++++++ <br>

if(listen(sockfd,5)<0) <br>

{ <br>

perror("listen"); <br>

exit(3); <br>

} <br>

printf("listen ok\n"); //+++++++++++++++temp+++++++++++++++ <br>



FD_ZERO( &readfds); //处理…… <br>

FD_SET( sockfd, &readfds); <br>

for ( k=0;k<=num;k++) <br>

FD_SET( userfd[k], &readfds); //加入集中去… <br>

/*** 发现错误后增加如下语句 <br>

maxfd=sockfd+1; <br>

/*** <br>

////////////////////////////////////////////////////////////////////// <br>

//is the main loop while <br>

userfd[0]=0;// 0 is empty! <br>

while(1) <br>

{ <br>

if (userfd[num]>maxfd) <br>

maxfd=userfd[num]; //needn't <br>

select( maxfd, &readfds, NULL, NULL, NULL); //判断maxfd <br>

//case 1 :if some new client comes <br>

if ( FD_ISSET( sockfd, &readfds)) <br>

{ <br>

printf("get connect\n");//debug <br>

num++; <br>

namelen=sizeof(server); <br>

if((userfd[num]=accept(sockfd,&server,&namelen))<0) <br>



//建立新连接, 并将该连接描述符加入到 sockset 中去了,此为有新连接… <br>

{ <br>

perror("accept"); <br>

exit(4); <br>

} //如果退出,那… <br>

printf("server: got connection from %s\n",inet_ntoa(server.sin_addr)); <br>

strcpy(id[num],"203.93.49.33");//inet_ntoa(server.sin_addr)); **@@## <br>

printf("new connection from %s/n",id[num]); //IP地址 <br>

printf("a new user comes!!"); <br>

gettime(); <br>

strncpy(todaylog,today,8); <br>

strcat(todaylog,".log"); <br>

if ((fd1=open(todaylog))==-1) <br>

{ <br>

creat(todaylog,2); <br>

fd1=open(todaylog,2); <br>

} <br>

write(fd1,id[num],20); //保存 <br>

write(fd1,":",2); //操作 <br>

write(fd1,"IN",6); //日志 <br>

write(fd1,":",2); //文件 <br>

write(fd1,timenow,30); //时间 <br>



strncpy(showin,id[num],20); <br>

strcat(showin,"has come!"); <br>

for(k=1;k<num;k++) <br>

if (inspect[k]) <br>

write(userfd[k],showin,29); <br>

FD_SET(userfd[num],&readfds); //加到集中…because of linked recently; <br>

} <br>

//end case 1:end some new client comes <br>

//case 2:if some connected clients send some message <br>

for ( k=1;k<=num;k++) <br>

{ <br>

if (FD_ISSET(userfd[k], &readfds)) <br>

{ <br>

number=k; <br>

read(userfd[k],infofromclient,50); <br>

printf("%s\n",infofromclient); <br>

strncpy(request,infofromclient,3); <br>

gettime(); <br>

strncpy(todaylog,today,8); <br>

strcat(todaylog,".log"); <br>

if ((fd1=open(todaylog))==-1) <br>

{ <br>

{ <br>

creat(todaylog,2); <br>

fd1=open(todaylog,2); <br>

} <br>

write(fd1,id[number],20); //保存 <br>

write(fd1,":",2); //操作 <br>

write(fd1,request,6); //日志 <br>

write(fd1,":",2); //文件 <br>

write(fd1,timenow,30); //时间 <br>

//MMM SSSS GGG @@@ <br>

if (strcmp(request,"MSG")==0) <br>

{ <br>

gettime(); <br>

strncpy(todayinfo,today,8); <br>

strcat(todayinfo,".info"); <br>

if ((fd2=open(todayinfo,2))==-1) <br>

{ <br>

creat(todayinfo,2); <br>

fd2=open(todayinfo,2); <br>

} <br>

for(i=0;i<=45;i++) <br>

message=infofromclient[i+4]; <br>

msg(); <br>

msg(); <br>

} <br>

//HHH IIII SSS @@@ <br>

/* if (strcmp(request,"HIS")==0) <br>

{ <br>

for(i=0;i<=14;i++) <br>

history=infofromclient[i+4]; <br>

strcat(history,".info"); <br>

if ((fd=open(history,2))==-1) <br>

{ <br>

printf("the file dosn't exist!"); <br>

exit(6); <br>

} <br>

do <br>

{ <br>

his(); <br>

sleep(1); //pause in order to let client read!! <br>

} <br>

while(!eof(fd1)); <br>

}*/ <br>

if (strcmp(request,"OUT")==0) <br>

out(); <br>

} <br>

} <br>

} <br>

//end case 2:end some connected clients send some message <br>

} <br>

//end of main loop while <br>

} //OK! end main <br>

/////////////////////////////////////////////////////////////////////// <br>

msg() <br>

{ <br>

int k; <br>

char record[100]; <br>

write(fd2,id[number],20); //保存 <br>

write(fd2,":",2); //信息 <br>

write(fd2,message,46); //记录 <br>

write(fd2,":",2); //文件 <br>

write(fd2,timenow,30); //时间 <br>

lseek(fd2,-100L,2); <br>

read(fd2,record,100); <br>

for ( k=0;k<=num;k++) <br>

if (inspect[k]) <br>

write(userfd[k],record,100); <br>

lseek(fd2,100L,1); <br>

} <br>

} <br>

his() <br>

{ <br>

char onerecord[100]; <br>

read(fd,onerecord,100); <br>

write(userfd[number],onerecord,100); <br>

lseek(fd1,100L,1); <br>

} <br>

out() <br>

{ <br>

int k; <br>

char showout[31]; <br>

strncpy(showout,id[number],20); <br>

strcat(showout,"is out yet!",11); <br>

shutdown(userfd[number],2); <br>

for(k=1;k<=num;k++) <br>

if (inspect[k]) <br>

write(userfd[k],showout,31); <br>

inspect[k]=0; <br>

} <br>

void gettime() <br>

{ <br>

time_t timer; <br>

time_t timer; <br>

char mon[2]; <br>

char year[4]; <br>

char mday[2]; <br>

char year1[4]; <br>

char mday1[2]; <br>

char mon1[2]; <br>

struct tm *t; <br>

timer=time(NULL); <br>

t=localtime(&timer); <br>

strcpy(timenow,asctime(t)); <br>

(t->tm_mon)++; <br>

sprintf(mon1,"%d",t->tm_mon); <br>

if (t->tm_mon/10==0) <br>

{ <br>

strcpy(mon,"0"); <br>

strcat(mon,mon1); <br>

} <br>

else strcpy(mon,mon1); <br>

t->tm_year+=1900; <br>

sprintf(year1,"%d",t->tm_year); <br>

strcpy(year,year1); <br>

strcpy(today,year); <br>



sprintf(mday1,"%d",t->tm_mday); <br>

if (t->tm_mday/10==0) <br>

{ <br>

strcpy(mday,"0"); <br>

strcat(mday,mday1); <br>

} <br>

else strcpy(mday,mday1); <br>

strncat(today,mon,2); <br>

strncat(today,mday,2); <br>

} <br>

/***********end cpserver.c*************/ <br>

希望以后大家多交流。hjian99@163.net <br>

  <br>

-- <br>

Target Locked:Guru In Darkness. <br>

我只是一只静静卧着的狮子。。。 <br>

※ 修改:·guru 於 09月19日19:23:19 修改本文·[FROM: 202.114.36.179] <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.179] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="126.htm">上一层</a>][<a href="132.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -