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