📄 131.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 + -