📄 00000005.htm
字号:
if (listen(DaemonSocket,1024)!=0) { <BR> <BR> printf("Can not listen!\n"); <BR> <BR> return 0; <BR> <BR> } <BR> <BR> <BR> return 1; <BR> <BR> } <BR> <BR> <BR> Incoming call <BR> <BR> <BR> 要查看是否有连线进来,可用以下方式: <BR> <BR> <BR> int incoming_call(void) <BR> <BR> { <BR> <BR> fd_set sock; <BR> <BR> struct timeval tv; <BR> <BR> int t; <BR> <BR> <BR> FD_ZERO(&sock); <BR> <BR> FD_SET(DaemonpSignal(); <BR> <BR> if (!BindSocket()) { <BR> <BR> printf("Can not bind socket!\n"); <BR> <BR> exit(1); <BR> <BR> } <BR> <BR> WriteLock(); <BR> <BR> } <BR> <BR> <BR> printf("Chess Daemon is up, have fun!\n"); <BR> <BR> <BR> now = time(NULL); <BR> <BR> <BR> dlog("----------------------------------------------\n"); <BR> <BR> dlog( <BR> <BR> "I am back! %s" <BR> <BR> "Chess Daemon comes to alive again.\n", <BR> <BR> asctime((const struct tm*)localtime(&now)) <BR> <BR> ); <BR> <BR> <BR> do { <BR> <BR> if (incoming_call()) { <BR> <BR> <BR> if (ConnectClient()) { <BR> <BR> <BR> fd_set sock; <BR> <BR> struct timeval tv; <BR> <BR> int t; <BR> <BR> char BUF[128]; <BR> <BR> char CC[2]; <BR> <BR> int n; <BR> <BR> <BR> daemon_printf("Welcome to Chinese Chess Game Center!\n"); <BR> <BR> <BR> FD_ZERO(&sock); <BR> <BR> FD_SET(ClientSocket,&sock); <BR> <BR> n = 0; <BR> <BR> do { <BR> <BR> tv.tv_sec = 60; tv.tv_usec = 0; <BR> <BR> t = select(ClientSocket+1,&sock,NULL,NULL,&tv); <BR> <BR> if (t<=0||!FD_ISSET(ClientSocket,&sock)) ; <BR> <BR> read(ClientSocket,CC,1); <BR> <BR> if (CC[0]==13||CC[0]==10||CC[0]==0) { <BR> <BR> BUF[n] = 0; <BR> <BR> dlog("%s\n",BUF); <BR> <BR> if (strncasecmp(BUF,"exit",4)==0) { <BR> <BR> close(ClientSocket); <BR> <BR> break; <BR> <BR> } <BR> <BR> n = 0; <BR> <BR> } else { <BR> <BR> BUF[n]=CC[0]; n++; <BR> <BR> } <BR> <BR> } while (1); <BR> <BR> } <BR> <BR> } <BR> <BR> } while (1); <BR> <BR> <BR> return 1; <BR> <BR> } <BR> <BR> <BR> 检验 <BR> <BR> <BR> telnet localhost 9901 <BR> <BR> <BR> <BR> <BR> 在处理Connect Client时,事实上可以运用fork或thread来处理多个连线。 <BR> <BR> <BR> <BR> inetd programming <BR> <BR> <BR> 利用inetd来做网路程式设计是个既简单又稳定的设计方法,您不需要考虑到复 <BR> <BR> 杂的socket programming。您的设计工作几乎在设计好通讯协定後就完成了, <BR> <BR> 所需要的技巧,仅为简单的文字分析技巧。 <BR> <BR> <BR> goodie inet service <BR> <BR> <BR> 首先,我们先来撰写一个称为goodie的服务程式。 <BR> <BR> goodie.c <BR> <BR> <BR> #include <stdio.h> <BR> <BR> #include <stdlib.h> <BR> <BR> #include <unistd.h> <BR> <BR> <BR> void main(void) <BR> <BR> { <BR> <BR> printf("Welcome to goodie service!\n"); <BR> <BR> } <BR> <BR> <BR> 这个程式很简单,不是吗? <BR> <BR> <BR> 编译 <BR> <BR> <BR> gcc -o goodie goodie.c <BR> <BR> <BR> 设定/etc/services及/etc/inetd.conf <BR> <BR> <BR> 在/etc/services中加入以下这一行 <BR> <BR> <BR> goodie 20001/tcp <BR> <BR> <BR> 其意义为goodie这项服务是在port 20001、TCP协定。 <BR> <BR> <BR> 接下来在/etc/inetd.conf中加入以下这一行 <BR> <BR> <BR> goodie stream tcp nowait root /full_goodie_path_name/goodie <BR> <BR> <BR> 各项叁数的意义为 <BR> <BR> <service_name> <sock_type> <proto> <flags> <user> <server_path> <BR> <BR> <args> <BR> <BR> <BR> service_name需要为在services中存在的名称。 <BR> <BR> sock_type有很多种,大多用的是stream/dgram。 <BR> <BR> proto一般用tcp/udp。 <BR> <BR> flags有wait/nowait。 <BR> <BR> user是您指定该程式要以那一个使用者来启动,这个例子中用的是root,如果 <BR> <BR> 有安全性的考量,应该要改用nobody。一般来说,建议您用低权限的使用者, <BR> <BR> 除非必要,不开放root使用权。 <BR> <BR> server_path及args,这是您的服务程式的位置及您所想加入的叁数。 <BR> <BR> <BR> 接下来重新启动inetd <BR> <BR> <BR> killall inetd <BR> <BR> inetd <BR> <BR> <BR> 这样我们便建立起一个port 20001的goodie service。 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -