打印本文 打印本文 关闭窗口 关闭窗口
Linux程式设计入门 - socket/inetd programming
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2498  更新时间:2009/4/22 20:47:25  文章录入:mintao  责任编辑:mintao
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时,事实上可以运用forkthread来处理多个连线。

 

 

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 20001TCP协定。

 

接下来在/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

flagswait/nowait

user是您指定该程式要以那一个使用者来启动,这个例子中用的是root,如果

有安全性的考量,应该要改用nobody。一般来说,建议您用低权限的使用者,

除非必要,不开放root使用权。

server_pathargs,这是您的服务程式的位置及您所想加入的叁数。

 

接下来重新启动inetd

 

killall inetd

inetd

 

这样我们便建立起一个port 20001good

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口