- 浏览: 1454518 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (564)
- 算法 (7)
- 流金岁月 (1)
- Javascript (30)
- actionscript (108)
- as3.0 game (14)
- flex (84)
- fms2 (27)
- 正则表达式 (7)
- 开源组件代码(as3.0) (1)
- Pv3d (13)
- Cairngorm (4)
- vbs (54)
- VB程序设计 (26)
- 计算机应用与维护 (4)
- 职场实用穿衣技巧 (3)
- 历史风云 (15)
- 淡泊明志,宁静致远 (12)
- 情感 (26)
- 杂谈 (41)
- 越南风 (14)
- DirectX (9)
- Dev-cpp (11)
- 回望百年 (2)
- 建站经验 (2)
- Python (24)
- 网络赚钱 (4)
- php (2)
- html (1)
- ob0短址网 (1)
- ob0.cn (1)
- wordpress (1)
- pandas logistic (1)
- haxe (1)
- opencv (1)
- 微信小程序 (3)
- vue (3)
- Flutter (1)
最新评论
-
GGGGeek:
第一个函数滚动监听不起作用,onPageScroll可以
微信小程序--搜索框滚动到顶部时悬浮 -
naomibyron:
解决办法:工具 -> 编译选项 -> 编译器 ...
dev-c++中编译含WINSOCK的代码出现错误的解决方法 -
haichuan11:
这个…… 代码不全真的是让人很憋屈的感觉啊
actionScript 3.0 图片裁剪及旋转 -
chenyw101:
老兄能留个QQ号吗?具体的我有些东西想请教下你
用VB制作网站登陆器 -
yantao1943:
貌似有点问题,只派发一次事件啊
使用ActionScript 2.0或ActionScript 3.0处理音频文件的提示点(cue
Multi-threaded Client/Server Socket Class
C/S 多线程 Socket 类
·
Download
ServerSocket demo project - 47.2 KB
原文地址:http://www.codeproject.com/KB/IP/serversocket.aspx
Screenshots
屏幕截图
Note: The demo can be started in Client or Server mode, executed with "/C" (or "/CLIENT") or "/S" (or "/SERVER", which is the default).
说明:示例可以以客户端或服务器模式启动,默认用“
/C
”(或“
/CLIENT
”)或“
/S
”
(
或“
/SERVER
”
)
执行。
Introduction
介绍
This article is about a client/server multi-threaded socket class. The thread is optional since the developer/designer is still responsible for deciding if he/she needs it. There are other Socket classes here and other places over the Internet, but none of them can provide feedback (event detection) to your application like this one does. It provides you with the following events detection: connection established, connection dropped, connection failed and data reception (including 0 byte packet).
本文内容主要是关于一个 C/S 的多线程 Socket 类。线程是可选择的,开发设计人员可根据他们的需求来决定是否使用。在互联网上,也有一些其他的 Socket 类,但它们都没有为你的应用程序提供反馈(事件探测),而本示例却提供了,且提供了如下几种事件探测:连接建立,连接断开,连接失败和数据接收(包括 0 比特的数据包)。
Description
描述
This article presents a new socket class which supports both TCP and UDP communication. It provides some advantages compared to other classes that you may find here or on some other Socket Programming articles. First of all, this class doesn't have any limitation like the need to provide a window handle to be used. This limitation is bad if all you want is a simple console application. So, this library doesn't have such a limitation. It also provides threading support automatically for you, which handles the socket connection and disconnection to a peer. It also features some options not yet found in any socket classes that I have seen so far. It supports both client and server sockets. A server socket can be referred as to a socket that can accept many connections. A client socket is a socket that is connected to a server socket. You may still use this class to communicate between two applications without establishing a connection. In the latter case, you will want to create two UDP server sockets (one for each application). This class also helps reduce coding needed to create chat-like applications and IPC (Inter-Process Communication) between two or more applications (processes). Reliable communication between two peers is also supported with TCP/IP with error handling. You may want to use the smart addressing operation to control the destination of the data being transmitted (UDP only). TCP operation of this class deals only with communication between two peers.
Now for those not familiar with IP Socket, the following section will give some details on how it works. This is also the goal with this article: to explain the basic functionality behind socket objects.
本文介绍的
Socket
类同时支持
TCP
和
UDP
通讯。相对于你从其他
Socket
编程文章中找到的
Socket
类,本文介绍的类有一些优点。首先,该类没有任何限制,比如没有要提供窗口才能使用的限制,若你需要在控制台程序中使用时,这样的限制是相当糟糕的。因此,这儿的库就没有对此进行限制。其次它会自动提供对线程的支持,以处理同另一端的连接和断开连接。它还有一些我在其他
Socket
类中从未见到过的特色选项。它同时提供对客户端和服务端
Socket
的支持。一个服务器端的套接字可以被许多接受连接的套接字引用。一个客户端套接字可以用于与服务端套接字的连接。你可以不建立连接,仅使用该类在两个应用程序之间进行通信,对于后一种情况,你需要创建
2
个
UDP
服务器套接字(一个应用程序一个)。在你创建一些类似聊天的程序和一些进程间通信(两个或多个应用进程间的通信)时,该类会减少需要编写的代码量。通过
TCP/IP
错误处理,还提供了双方的可靠通信。你可能还想通过智能寻址操作来控制数据传输的目标(仅
UDP
)。该类的
TCP
操作仅处理双方之间的通信。对于那些对
IP
Socket
还不是很熟悉的朋友,
下面这节就会给出其如何工作的一些细节。这也是本文的目的之一:解释
Socket
对象背后的基本功能。
TCP/IP Stack
TCP/IP 栈
The TCP/IP stack is shorter than the OSI one:
TCP/IP
所分层数要比OSI模型的层数少
:
TCP is a connection-oriented protocol, while UDP (User Datagram Protocol) is a connectionless protocol.
TCP 是面向连接的协议,而 UDP (用户自寻址协议)则是无连接协议。
IP Datagrams
IP 数据包
The IP layer provides a connectionless and unreliable delivery system. It considers each datagram independently of the others. Any association between datagrams must be supplied by the higher layers. The IP layer supplies a checksum that includes its own header. The header includes the source and destination addresses. The IP layer handles routing through the Internet. It is also responsible for breaking up large datagrams into smaller ones for transmission and reassembling them at the other end.
在网络层提供了无连接的不可靠传输系统。它认为每个数据包对于其他数据包都是独立的。数据包之间的任何联系都需要靠更高的层来代理。网络层提供包含自身报头的检查和。报头又包含了源地址和目的地址。网络层还对互联网的路由进行处理,负责对大数据包进行分解,并在另一端重新进行组合。
UDP
UDP is also connectionless and unreliable. What it adds to IP is a checksum for the contents of the datagram and port numbers. These are used to give a client/server model: see later.
UDP (用户数据报协议)是无连接和不可靠的,它被作为数据包内容和端口号的检查和加到 IP 中,它将被用来给出 C/S 模型,稍后会进行描述。
TCP
TCP supplies logic to give a reliable connection-oriented protocol above IP. It provides a virtual circuit that two processes can use to communicate.
TCP 为网络层之上的逻辑提供可靠的面向连接的协议。它提供一个虚拟电路以用于两个进程之间的通信。
Internet Addresses
In order to use a service, you must be able to find it. The Internet uses an address scheme for machines so that they can be located. The address is a 32-bit integer which gives the IP address. This encodes a network ID and more addressing. The network ID falls into various classes according to the size of the network address.
为了能使用服务,你必须找到它。互联网对计算机使用地址摘要来标识计算机的位置。 IP 地址是一个 32 位的整数。它是通过对网络 ID 和更多的寻址信息加密得到的。根据 IP 地址的大小,网络 ID 分成了不同的几类。
Network Address
Class A uses 8 bits for the network address with 24 bits left over for other addressing. Class B uses 16-bit network addressing; class C uses 24-bit network addressing and class D uses all 32.
A 类地址用 8 位来表示网络寻址, 24 位来表示其他寻址。 B 类地址用 16 位来表示网络寻址, C 类用 24 位来表示网络寻址, D 类则用全部的 32 位来表示网络寻址。
Subnet Address
Internally, the Unix network is divided into subnetworks. Building 11 is currently on one subnetwork and uses 10-bit addressing, allowing 1024 different hosts.
在内部, Unix 的网络划分为若干子网。用 11 来表示当前的一个子网,用 10 位来寻址,则允许有 1024 台不同的主机。
Host Address
8 bits are finally used for host addresses within our subnet. This places a limit of 256 machines that can be on the subnet.
在我们的子网中,有 8 位用于主机寻址。则该子网中的主机不能超过 256 台。
Total Address
The 32-bit address is usually written as 4 integers separated by dots.
32
位的地址常常写成用逗号分隔的
4
个整数。
Port Addresses
A service exists on a host and is identified by its port. This is a 16-bit number. To send a message to a server, you send it to the port for that service of the host that it is running on. This is not location transparency! Certain of these ports are "well known." For example:
一个主机上存在的服务通过其端口号来标识。它是一个 16 位的数字。向服务器发送消息,你就是向那台主机上运行的服务的端口号发送消息。没有哪个位置是透明的!当然这些端口号都是“清楚”的。例如:
tcpmux |
1 |
TCP |
echo |
7 |
UDP |
echo |
7 |
TCP |
systat |
11 |
TCP |
netstat |
15 |
TCP |
ftp-data |
20 |
TCP File Transfer Protocol (data) |
ftp |
21 |
TCP File Transfer Protocol |
smtp |
25 |
TCP Simple Mail Transfer Protocol |
time |
37 |
TCP Time Server |
time |
37 |
UDP Time Server |
name |
42 |
UDP Name Server |
whois |
43 |
TCP nicname |
domain |
53 |
UDP |
domain |
53 |
TCP |
tftp |
69 |
UDP |
rje |
77 |
TCP |
finger |
79 |
TCP |
link |
87 |
TCP ttylink |
supdup |
95 |
TCP |
hostname |
101 |
TCP hostname |
pop-2 |
109 |
TCP Post Office Protocol |
uucp-path |
117 |
TCP |
nntp |
119 |
TCP Network News Transfer Protocol |
ntp |
123 |
TCP Network Time Protocol |
Ports in the region 1-255 are reserved by TCP/IP. The system may reserve more. User processes may have their own ports above 1023. The function getservbyname can be used to find the port for a service that is registered.
1-255 之间的端口号是被 TCP/IP 保留的。系统可能保留的端口号更多。用户自己使用的端口号应该在 1023 之上。 Getservbyname 函数用于找到注册服务的端口号。
Sockets
套接字
A socket is a data structure maintained by the system to handle network connections. A socket is created using the call socket . It returns an integer that is like a file descriptor. In fact, under Windows, this handle can be used with the ReadFile and WriteFile functions.
一个套接字是系统用于处理网络连接所保持的数据结构。可以通过调用 socket 方法来创建套接字。结果是返回一个如文件描述符之类的整数。实际上,在 Windows 环境中,这种操作可以结合着 ReadFile 和 WriteFile 函数来使用。
#include < sys / types.h >
#include < sys / socket.h >
int socket( int family, int type, int protocol);
Here, "family" will be AF_INET for IP communications, protocol will be zero and type will depend on whether TCP or UDP is used. Two processes wishing to communicate over a network create a socket each. These are similar to two ends of a pipe, but the actual pipe does not yet exist.
此处,“ family ”参数可以用 AF_INET 表示 IP 通信, protocol 参数为 0 , type 参数则要根据是用 TCP 还是 UDP 来定。两个进程之间通过创建各自的套接字来进行通信,这和管道很类似,然而并不存在什么管道。
Connection Oriented (TCP)
面向连接( TCP )
One process (server) makes its socket known to the system using bind . This will allow other sockets to find it. It then "listens" on this socket to "accept" any incoming messages. The other process (client) establishes a network connection to it and then the two exchange messages. As many messages as needed may be sent along this channel, in either direction.
服务端进程通过 bind 方法将其套接字告知系统,以使其他的套接字能找到它。它可通过套接字的“侦听( listen )”来“接收( accept )”发过来的信息。客户端的进程同服务端套接字建立连接然后交换信息。需要的信息都可以从该通道向任一端进行发送。
Server:
服务器:
- Create endpoint ( socket() )
- Bind address ( bind() )
- Specify queue ( listen() )
- Wait for connection ( accept() )
- Transfer data ( read() / write() )
- 创建端点 ( socket() )
- 绑定地址 ( bind() )
- 指定队列 ( listen() )
- 等待连接 ( accept() )
- 传输数据 ( read() / write() )
Client:
客户端:
- Create endpoint ( socket() )
- Connect to server ( connect() )
- Transfer data (
发表评论
-
wxpython学习笔记
2011-01-13 21:21 2032出处:http://www.cnblogs.com ... -
ADO编程实用宝典
2009-05-08 13:05 1478目录 ADO编程实用宝典 目录 一引入A ... -
创建ACCESS的存储过程
2008-09-11 22:52 4803在Access自身的帮助中看到了Create Procedu ... -
实现服务器端的多线程SOCKET Server
2008-09-11 16:45 3413实现服务器端的多线程SOCKET Server 想要实现 ... -
轻量级xml读写模块 tinyXML
2008-09-11 16:32 2900文档和使用例子: http://www.grinningl ... -
基于TinyXML的XML文档操作(部分测试代码)
2008-09-11 16:31 2436#include <stdio.h> #incl ... -
使用tinyxml类解析XML
2008-09-11 16:26 2450读取和设置xml配置文件是最常用的操作,试用了几个C++的XM ... -
用VB制作网站登陆器
2008-08-25 20:59 4098Private Sub Command1_Click() Wb ... -
vb+Webbrowser控件详解
2008-08-25 20:54 3283方法 说明 GoBack 相当 ... -
VB自动提交表单问题
2008-08-25 14:32 2478需要知道表单名称呢,比如 <Form name=&quo ... -
BBS灌水机脚本(vb scritp, telnet, bbs, sterm)
2008-08-16 11:32 2519'****************************** ... -
c++下载网页的代码,VC6.0编译通过
2008-05-30 19:21 3859#include <winsock2.h> ... -
C++ Socket Class for Windows
2008-05-30 18:59 1634Here, I present the source c ... -
C++ socket程序
2008-05-30 17:58 11513C++ socket程序 下面是一个C++调用windows ... -
字符串提取
2008-05-05 11:24 1304Function bTest(ByVal s As Strin ... -
VB用正则表达式提取网页中的链接
2008-05-05 10:37 2905VBScript code Function getUrl ... -
利用VB提取HTML文件中的EMAIL地址
2008-05-05 09:53 1193电子邮件(EMAIL)是INTERNET上应用最广泛的一种服务 ... -
VB6.0如何使用正则表达式
2008-05-04 20:39 8013最近在用VB6解决一个网页解析的应用,涉及到了正则。如何在VB ... -
VB写一个IE插件
2008-05-04 18:20 3072Q: 就类似于3721的插件一样,当用户浏览我的网站的时候,提 ... -
破解VisualStudio2005(vs2005) 的180天限制
2008-04-19 11:53 4568中文版本的软件本身是正式版,但内置的序列号却是180天试用版的 ...
相关推荐
同时,还需要了解多线程或异步I/O技术,以便在服务器端同时处理多个客户端请求。 在压缩包文件"**C-S**"中,可能包含了服务器和客户端的源代码示例,这些代码通常使用C或C++编写,可能涉及了网络编程、字符串处理、...
使用多进程/多线程/socket通信等技术,实现一个简单c/s聊天系统. 介绍文章地址:https://blog.csdn.net/weixin_38746576/article/details/117381768
在IT领域,网络通信是不可或缺的一部分,特别是在分布式系统和客户端-服务器(C/S)架构中。C++作为一门强大的编程语言...同时,熟悉这些基础知识也有助于进一步探索TCP/IP协议、多线程、并发处理等高级网络编程话题。
使用线程池实现的完整的 Client/Server Socket通讯类,很容易使用,也很容易被集成到C++应用程序中。也适用于Linux/Unix。 Best C++/MFC article of February 2009
实际应用中,可能需要处理更复杂的情况,如并发连接、错误处理、多线程等。 在提供的压缩包文件"TCP实验"中,可能包含了实现上述功能的示例代码和练习,通过实践这些代码,你可以更深入地理解TCP套接字编程。学习...
在实际项目中,C/S通信涉及到的细节非常多,包括错误处理、多线程、并发连接管理、数据的序列化与反序列化等。例如,服务器端可能需要同时处理多个客户端的连接,这时就需要用到多线程或者异步I/O。数据传输时,为了...
包含C语言完整的socket简单c/s通信代码,有tcp连接的,也有UDP连接的,有多线程实现还有单线程实现,可供比较。还有domain socket c/s通信简单应用的完整代码 C语言 socket tcp/ip domain socket 代码
对比两者的开销有助于理解多进程和多线程在性能上的优劣。 6. **代码文件分析**: - `server.c` 和 `client.c` 可能是实现基本C/S通信的客户端和服务器端源代码。 - `oneservermain.cpp` 和 `mulclientmain.cpp` ...
Java Socket是Java网络编程中的重要组成部分,主要用于实现客户端(Client)和服务器端(Server)之间的通信。本项目通过Java Socket库构建了...在实际开发中,还可以考虑添加多线程支持,以处理多个并发的客户端连接。
总的来说,"C/S聊天程序(JAVA,C/S)"是一个综合性的项目,涵盖了网络编程、多线程、数据库操作以及用户界面设计等多个Java编程的重要知识点。通过学习和实践这个项目,开发者可以提升对C/S架构的理解和Java编程技能。
在实际应用中,`socketserver`和`socketclient`文件可能包含了更复杂的逻辑,例如错误处理、多线程处理多个客户端连接、数据编码解码等。学习和理解这两个文件的代码,可以帮助我们更好地掌握C#中Socket通信的实践...
类似于QQ的局域网聊天软件,包括服务器端和客户端程序,采用tcp/ip socket多线程编程,服务器端主要负责客户端用户的注册登陆,用户资料的获取.客户端负责与其他客户端进行信息控制与传递(包括聊天和传送文件).
本文将深入探讨“C/S反应堆模型”在socket网络编程中的应用,以及如何使用C++语言实现这一模型。 首先,我们要理解C/S模型的基本概念。C/S模型是一种两层架构,由客户端(Client)和服务器端(Server)组成。客户端...
实现了C/S架构的Socket多线程IO通信。 实现了Socket长连接的TCP网络通信。 基于Java GUI的人机交互界面,单个服务器(Server)持续处理客户端信息并统一转发,多个客户端(Client)可以同时持续与服务器建立连接并相互...
Socket编程是计算机网络编程中的重要组成部分,特别是在C/S(Client-Server)架构中,它扮演着数据通信的核心角色。在本课程设计中,我们将深入理解并实践如何利用Socket进行C/S结构的应用程序开发。 首先,我们...
在IT领域,C/S模式(Client/Server模式)是一种常见的网络通信架构,它将应用程序分为客户端和服务器两部分。在这个模式下,客户端发起请求,服务器接收...同时,这也是学习网络编程、多线程编程和C语言实践的好机会。
在IT行业中,网络通信是至关重要的一个领域,而Socket编程是实现网络通信的基础。本示例将探讨如何使用Java语言来...在实际开发中,还需要考虑异常处理、多线程、安全性和性能优化等问题,以确保系统的稳定性和效率。
综上所述,这个C语言实现的C/S结构聊天室项目涵盖了C语言基础、网络编程、I/O多路复用、多线程以及跨平台问题等多个方面的知识。对于想要深入学习网络编程的C程序员来说,这是一个极好的实践案例。通过分析和修复...
本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的...
本实例主要探讨的是使用C++实现基于Socket的多线程通信,具体涉及了VC++(Visual C++)环境下的开发,以及C/S(Client/Server)架构的双向通信模式。下面我们将详细讲解相关知识点。 首先,Socket是网络通信的基本...