建立TCP服务器的各个系统具体的调用过程

在这里插入图片描述

- 服务器:
1、创建socket -> int socket(int domain, int type, int protocol);

  • domain:协议域,决定了socket的地址类型,IPv4为AF_INET。
  • type:指定socket类型,SOCK_STREAM为TCP连接。
  • protocol:指定协议。IPPROTO_TCP表示TCP协议,为0时自动选择type默认协议。

2、绑定socket和端口号 -> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • sockfd:socket返回的套接字描述符,类似于文件描述符fd。
  • addr:有个sockaddr类型数据的指针,指向的是被绑定结构变量。
  • addrlen:地址长度。
// IPv4的sockaddr地址结 构
struct sockaddr_ in {
	sa_ family_ t sin_ family;//协议类型,AF_ INET
	in_ port_ _t sin_ _port; // 端口号
	struct in_ addr sin_ _addr; // IP地址
};
struct in_ addr {
	uint32_ t s_ addr;
}

3、监听端口号 -> int listen(int sockfd, int backlog);

  • sockfd:要监听的sock描述字。
  • backlog:socket可以排队的最大连接数。

4、 接收用户请求 -> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  • sockfd:服务器socket描述字。
  • addr:指向地址结构指针。
  • addrlen:协议地址长度。
    :一旦accept某个客户机请求成功将返回一个全新的描述符用于标识具体客户的TCP连接。

5、从socket中读取字符 -> ssize_t read(int fd, void *buf, size_t count);

  • fd:连接描述字。
  • buf:缓冲区buf。
  • count:缓冲区长度。
  • :大于0表示读取的字节数,返回0表示文件读取结束,小于0表示发生错误。

6、关闭socket -> int close(int fd);

  • fd:accept返回的连接描述字,每个连接有一个,生命周期为连接周期。
  • :sockfd是监听描述字,一个服务器只有一个,用于监听是否有连接;fd是连接描述字,用于每个连接的操作。

- 客户机:
1、创建socket -> int socket(int domain, int type, int protocol);

2、连接指定计算机 -> int connect(int sockfd, struct sockaddr * addr, socklen_t addrlen)

  • sockfd客户端的sock描述字。
  • addr:服务器的地址。
  • addrlen:socket地址长度。

3、向socket写入信息 -> ssize_t write(int fd, const void *buf, size_t count);

  • fd、buf、count:同read中意义。
  • 大于0表示写了部分或全部数据,小于0表示出错。

4、关闭oscket -> int close(int fd);

  • fd:同服务器端fd
RC 是 remote call 的缩写,顾名思义 RC32 为 32 位的远程调用接口,RC64 为 64 位 的远程调用接口,RC 基于TCP/IP 传输协议。 RC 分为二个部分:Client 端和 Server 端 1. Client 端的动态库名为 RC32c.dll/RC64c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为 RC32s.dll/RC64s.dll,负责接收Client端的请求并应答返回。 Client 端由三大类组成:Connection类、Command类和Fields类 1. Connection类主要负责与Server端的通讯和应答返回值的分发; 2. Command类主要负责命令参数编辑,提交及返回值读取操作; 3. Command执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection分发获取应答返回值; 4. Connection分发分为回调方式和查询方式,二者在一个Connection对象中只能 属于其中一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server类、Application类、Function类、Response类和Fields类 1. Server类主要负责与Client端的连接和数据通讯; 2. Application类主要负责Function的组织和Response的分发; 3. Function类主要负责Function的定义及调用模式; 4. Response类主要负责Client端指定Function请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation针对Client的请求连接可以通过OnConnect和OnDisconnect回调函数 得到连接ID,也可以通过RCSAppGetEvent函数得到; 6. 若Function的调用模式不是查询模式,则Client的请求应答由Application的处 理线程调用执行,否则必须调用RCSAppGetEvent函数得到Client的请求 应答ID,然后通过应答ID取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 RC 压缩包中含有如下文件: -------------------------------------------------------------------------------- \RC 3.0\_documents\RC 开发使用说明_v30.chm \RC 3.0\_documents\RC 开发使用说明_v30.pdf \RC 3.0\_exports\Delphi\RC32c.pas \RC 3.0\_exports\Delphi\RC32s.pas \RC 3.0\_exports\VC6\RC32c.lib \RC 3.0\_exports\VC6\RC32s.lib \RC 3.0\_exports\VC6\RCClient.h \RC 3.0\_exports\VC6\RCServer.h \RC 3.0\_exports\VS2008_x64\RC64c.lib \RC 3.0\_exports\VS2008_x64\RC64s.lib \RC 3.0\_exports\VS2008_x64\RCClient.h \RC 3.0\_exports\VS2008_x64\RCServer.h \RC 3.0\_linux\_rc32\librc32c.so \RC 3.0\_linux\_rc32\librc32s.so \RC 3.0\_linux\_rc32\RC32c.h \RC 3.0\_linux\_rc32\RC32s.h \RC 3.0\_linux\classes\client\CmdQueue.cpp \RC 3.0\_linux\classes\client\CmdQueue.h \RC 3.0\_linux\classes\client\RC32c.h \RC 3.0\_linux\classes\client\RCClientObj.cpp \RC 3.0\_linux\classes\client\RCClientObj.h \RC 3.0\_linux\classes\server\KYConnHandles.cpp \RC 3.0\_linux\classes\server\KYConnHandles.h \RC 3.0\_linux\classes\server\RC32s.h \RC 3.0\_linux\classes\server\RCServerObj.cpp \RC 3.0\_linux\classes\server\RCServerObj.h \RC 3.0\_linux\demo\source_test_rc-centos5.4.tar.gz \RC 3.0\_rc32\RC32c.dll \RC 3.0\_rc32\RC32s.dll \RC 3.0\_rc32\TestRCClient.exe \RC 3.0\_rc64\RC64c.dll \RC 3.0\_rc64\RC64s.dll \RC 3.0\classes\client\Delphi2006\CmdQueue.pas \RC 3.0\classes\client\Delphi2006\RC32c.pas \RC 3.0\classes\client\Delphi2006\RCClientObj.pas \RC 3.0\classes\client\VC++\CmdQueue.cpp \RC 3.0\classes\client\VC++\CmdQueue.h \RC 3.0\classes\client\VC++\RC32c.lib \RC 3.0\classes\client\VC++\RC64c.lib \RC 3.0\classes\client\VC++\RCClient.h \RC 3.0\classes\client\VC++\RCClientObj.cpp \RC 3.0\classes\client\VC++\RCClientObj.h \RC 3.0\classes\server\Delphi2006\ConnFileHandles.pas \RC 3.0\classes\server\Delphi2006\RC32s.pas \RC 3.0\classes\server\Delphi2006\RCServerObj.pas \RC 3.0\classes\server\Delphi2006\RespQueue.pas \RC 3.0\classes\server\VC++\RC32s.lib \RC 3.0\classes\server\VC++\RC64s.lib \RC 3.0\classes\server\VC++\RCServer.h \RC 3.0\classes\server\VC++\RCServerObj.cpp \RC 3.0\classes\server\VC++\RCServerObj.h \RC 3.0\demo\TestFields(delphi2006)\[工程: TestClient.dpr, TestServer.dpr] \RC 3.0\demo\TestRC32(VC6)\[工程: TestRC32c.dsp, TestRC32s.dsp] \RC 3.0\demo\TestRC64(VS2008)\[工程: TestRC64c.vcproj, TestRC64s.vcproj] --------------------------------------------------------------------------------
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值