用LPC做SERVER
2007/5/11 20:54:08

//written by super
偶的MUD编程经历之用LPC做SERVER。
最近把学的TCP/IP的网络知识运用了起来。就想着用LPC做一个SERVER玩玩。
首先,LPC支持的网络接口函数有:
socket_accept()
socket_acquire()
socket_address()
socket_bind()
socket_close()
socket_connect()
socket_create()
socket_error()
socket_listen()
socket_release()
socket_status()
socket_write()
大家都知道一个SERVER要运转起来,首先要先create()一个插口。
然后把某一知名端口通过blind()和create()出来的那个插口绑定起来。
然后把这一端口至于贞听(listen)状态。然后就通过accept()来接受客户端的
连接请求。
我们可以把上面这些过程看成是服务器的初始化。就可以集成为一个过程。
int s;
int server_init()
{
        int err;
        s = socket_create(STREAM,"create_callback","create_close");
        if (s < 0)
                return 0;
        err = socket_bind(s,PORT_NUM);
        if (err!=EESUCCESS)
                return 0;
        err = socket_listen(s,"listen_callback");
        if (err!=EESUCCESS)
                return 0;
        return 1;
}
这就是一个有连接状态的服务器的初始化的例子了。
然后就是决定怎么来socket_accept()新的连接了。
按照TCP/IP的原理,socket_accept()的过程应该是由一个
死循环的进程来处理的。只要accept()返回的值大于0,那这个返回的值就是
一新接口的描叙符。
但是在LPC里面,它不支持用户来FOLK()进程,所以说,它就把以上那死循环
包装好了,做成一个listen的参数,也就是socket_listen()的argument 2.
然后是,如果有连接请求,就马上调用以socket_listen()的第二个参数为名字
的过程。
void listen_callback(int fd)
{
        int new_fd = socket_accept(fd,"in_read_callback","in_write_callback");
        do_next(new_fd);
        return;
}
然后服务器和客户端就可以通过这个new_fd来进行通讯了。
如果这个时候服务器收到了客户端write()过来的消息。
就会自动调用in_read_callback()过程。
其实这个过程也是把一个死循环read()的过程封装起来了。
然后如果要通讯的话,就可以这样写:
void in_read_callback(int fd,string mess)
{}
这里的fd就是通讯的插口,mess就是收到的信息。
然后在这个过程里面可以用sscanf(mess,)来把mess处理成理想的格式
但是这时要注意一点。。要把传过来的mess最后面的/n/r,/n,/r,/r/n四种符号过滤掉。
要不然的话,你的程序可能会把这些东西弄错的。
然后就可以一直通讯到SERVER不想再通讯时就发送一个socket_close(fd)
但是这个命令是根据什么底层函数封装起来的偶就不太清楚了,所以客户端很难
捕捉到这个信息,除非也是用LPC做客户端。
下面附一简单程序:
//created by super at 2001
#include < ansi.h >
#include < socket_err.h >
#include < net/socket.h >
#include < net/socket_errors.h >
#include < globals.h >
#define PORT_NUM 777
inherit F_DBASE;
int run_server();
int do_server(int s);
int do_server1(int fd);
int do_quit(int fd);
int do_send_msg(int fd,string mess);
int do_who(int fd);
void create()
{
        set("name","grin");
        set("id","hehe");
        seteuid(getuid());
        run_server();
}
int run_server()
{
        int err,s;
        s = socket_create(STREAM,"create_callback","create_close");
        if (s < 0)
        {
                tell_object(this_player(),s + ": socket create error");
           

下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms