基于多线程的客户端/服务器套接字类

这篇文章主要介绍如何设计基于多线程的客户端/服务器套接字(socket)类。开发者/设计者可以根据具体的 需要决定是否选用另外的线程。在网络上有许多其它的套接字类,但是没有一个能够向这个类一样为你的应用程序 提供回调功能(事件监测)。本文设计的类能够为你提供如下的事件监测:完成建立链接、放弃链接、链接失败和 接收数据(包括0字节数据包)。

描述:

本文提供一种新的,同时支持TCP和UDP通讯的套接字类,与你可能在本站或其它地方发现的套接字编程文章相 比,本文设计的类有很多优点。首先,这个类没有像其它类要求提供窗口句柄的限制,假如你仅仅要一个控制应用 程序的话,这个限制是不好的,所以,本文的类没有这样的限制。它也为你提供了自动线程支持功能,套接字通过 类的句柄进行链接或断开链接操作,它也提供了目前为之我所见到的类所没有的其它功能。此类同时支持客户端和 服务器套接字,一个服务器端套接字能被指定为一个能够接受很多链接的套接字,一个客户端套接字能够链接一个 服务器端套接字。你还可以使用这个类在不建立链接的情况下在两个应用程序间进行通信。在第二种情况下,你可 以创建两个UDP套接字(每个程序一个)。这个类在创建像聊天室程序,或者在两个或更多IPC(进程间通信) 程序( 进程)时有助于减少编码量。同时为具有TCP/IP错误处理的双方提供可靠的通信支持。你可能会使用确定的IP地址 使数据传递到能够被控制的目的地(仅仅对于UDP方式),这个类的TCP方式只能够在相等的双方进行通信。

现在还不熟悉IP套接字,下面的段落将对此类如何工作进行详细的介绍。这有是本文的目标:解释套接字对象 的基本功能。

TCP/IP 栈

TCP/IP 栈比OSI栈短。

TCP是面向连接的协议,UDP(用户数据报协议)是面向无连接的协议。

IP数据报

IP层提供了一个无连接的,不可靠的传输机制。它认为每个数据包都是相互独立的。任何数据报之间的连接必 须被更高的层支持。IP层提供一种包含自身数据头的和校验。数据头包含数据报的源地址和目的地址。IP层通过网 络处理路由。为了传输,它也提供将大的数据报截断为许多小数据报,并在目的端将它们重新组合的机制。

UDP

UDP是无连接的,也是不可靠的。它将数据报内容的校验和(checksum)和端口号加到IP地址上。

TCP

TCP在IP上提供一个逻辑的可靠的基于连接的协议,它提供一个虚拟的环路,这样两个程序就可以进行通信。

互联网地址

为了使用一个服务,你首先要找到它。互联网使用地址规划计算机,这样计算机就能够被定位。IP地址是一个 整形32位整数,它编码了一个网络ID和相当多的地址。根据网络地址的大小,网络ID被分成了很多类。

网络地址

A类网使用8位作为网络地址,余下的24位表示其他的地址。B类网使用16位作为网络地址,C类网使用24位作为 网络地址,D类网使用全部的32位作为网络地址

时间: 2024-08-01 10:24:14

基于多线程的客户端/服务器套接字类的相关文章

Linux下套接字详解(五)----基于fork多进程的TCP套接字(阻塞/同步/并发)

简介 一个简单的改进方案是在服务器端使用多线程(或多进程).多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接.具体使用多进程还是多线程,并没有一个特定的模式.传统意义上,进程的开销要远远大于线程,所以如果需要同时为较多的客户机提供服务,则不推荐使用多进程:如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全.通常,使用pthread_create ()创建新线程,fork()创建新进程

使用异步服务器套接字编程指南(微软MSDN)

异步服务器套接字使用 .NET Framework 异步编程模型处理网络服务请求.Socket 类遵循标准 .NET Framework 异步命名模式:例如,同步 Accept 方法对应异步 BeginAccept 和 EndAccept 方法.异步服务器套接字需要一个开始接受网络连接请求的方法,一个处理连接请求并开始接收网络数据的回调方法以及一个结束接收数据的回调方法.本节将进一步讨论所有这些方法. 在下面的示例中,为开始接受网络连接请求,方法 StartListening 初始化 Socke

基于TCP的客户端服务器通信,如何在终端输入数据进行聊天呢,求大神帮我

问题描述 基于TCP的客户端服务器通信,如何在终端输入数据进行聊天呢,求大神帮我 //clientTcp.c #include #include #include #include #include #include #include #include #define SERVPORT 3333 //侦听端口地址 #define MAXDATASIZE 100 main(int argc,char argv[]) { int sockfd,sendbytes; char buf[MAXDATAS

db2-报错:打开端口50001上服务器套接字时出错

问题描述 报错:打开端口50001上服务器套接字时出错 各位兄台,我请教一个问题,在suse上用weblogic发布应用,应用发布起来了,但是没有连上之前配置好的db2数据库,报错:打开端口50001上服务器套接字时出错,是weblogic的问题呢,还是DB2的问题,应该怎么解决呢 解决方案 先看有没有程序侦听对应的端口.然后就是你程序是否连接上数据库.

实现基于事件通知的.Net套接字

以前学过MFC,我用过的它里面的包装Winsock的两个类CSocket和CAsyncSocket,我一直觉得它哪个事件通知的功能比较不错,特别是在连接的两方收发数据没有一定的规律的时候比较有用,虽然不用它的事件通知也可以实现功能,但是你需要循环检测套接字的状态或者阻塞等待,如果每次都要做这些琐碎的工作岂不是很麻烦,于是我就想对这些功能作一次封装.当然在.net里面采用delegate和event是最好的选择了.下面就是我实现的一些细节: 先讲一下思路:其实这个还是很简单了,估计高手们会不屑一顾

实现基于事件通知的.Net套接字_实用技巧

  以前学过MFC,我用过的它里面的包装Winsock的两个类CSocket和CAsyncSocket,我一直觉得它哪个事件通知的功能比较不错,特别是在连接的两方收发数据没有一定的规律的时候比较有用,虽然不用它的事件通知也可以实现功能,但是你需要循环检测套接字的状态或者阻塞等待,如果每次都要做这些琐碎的工作岂不是很麻烦,于是我就想对这些功能作一次封装.当然在.net里面采用delegate和event是最好的选择了.下面就是我实现的一些细节:   先讲一下思路:其实这个还是很简单了,估计高手们会

Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)

上节我们实现了一个简单的多进程的服务器程序,这节,我们服务器的框架不做修改,只是将其修改为一个多线程的服务器程序. 直接上代码 server #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <errno.h> #include <netinet/in.h> #include <sys/types.h&

基于套接字通信的远程截屏显示与控制技术

远程控制技术在远程设备(软件)的维护.监控与故障诊断等方面有广泛的应用前景,且大 都使用Client/Server模式.该结构包括连接在网络中的多台计算机,那些处理应用.请求另 一计算机服务的计算机为客户机(本地机),而响应请求并处理请求的计算机称为服务器(目标 机). 远程控制的原理[1]是:用户连接到网络上,客户程序发送身份验证信息和与远 程主机连接的请求,远程主机的服务器端程序验证客户身份,若验证通过,就与客户建立连 接,并向用户发送验证通过和已建立连接的信息.此时用户便可以通过客户端程序

Linux下套接字详解(九)---poll模式下的IO多路复用服务器

poll多路复用 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制. poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大. poll编程模型 函数原型 函数格式如下所示: # include <poll.h> int poll ( struct pol