当前位置:首页 > Windows程序 > 正文

套接字编程(VC

2021-03-24 Windows程序

简介(源于维基)

Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口。然而,由于AT&T的专利保护着UNIX,所以只有在1989年Berkeley大学才能自由地发布自己的操作系统和网络库。
Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程间可以通讯。 它可以在很多不同的输入/输出设备和驱动之上运行,尽管这有赖于操作系统的具体实现。 接口实现用于TCP/IP协议,因此它是维持Internet的基本技术之一。 它是由加利福尼亚的伯克利大学开发,最初用于Unix系统。 如今,所有的现代操作系统都有一些源于Berkeley套接字接口的实现,它已成为连接Internet的标准接口。
套接字接口的接入有三个不同的级别,最基础的也是最有效的就是raw socket级别接入。 很少的应用程序需要在外向通讯控制的这个级别接入,所以raw socket级别是只为了用于开发计算机Internet相关技术的。 最近几年,,大多数的操作系统已经实现了对它的全方位支持,包括Windows XP。

应用程序网络数据传输

端口:

定义:    一种抽象的软件结构,应用程序通过系统调用与某端口建立连接后,传输层给该端口的数据都被相应的进程接收,相应的进程发给传输层的数据都通过该端口输出

端口号:   一个整形标示符,来表示端口,取值为0~65535,1024以下的端口保留给预定义的服务

注意:    TCP/IP传输层的两个协议TCP与UDP是完全独立的两个软件模块,因此各自端口独立,也就是说TCP/UDP可以拥有相同的端口号

IP 地址:

所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节

套接字

说明

套接字存在于通信域中,通信域也叫地址簇,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性,综合在一起,套接字通常只与同一区域的套接字交换数据,(也可能跨区通信,但这只是在执行某种转换进程后才能实现).Windows Sockets只支持一个通信域,网际域(AF_INET),这个域被使用网际协议簇通信进程使用

套接字类型

SOCK_STREAM    流式套接字,提供面向连接的数据传输服务,数据无差错,无重复的发送,并且按发送顺序接送,流式套接字实际上是基于TCP实现的

SOCK_DGRAM      数据报式套接字,提供无连接服务,数据包以独立包形式发送,不提供无错保证,数据可能存在丢失或重复,并且接受顺序混乱,数据报式套接字实际上是基于UDP协议实现的

SOCK_RAM      原始套接字

网络字节顺序(套接字与地址簇中使用)

由于不同的计算机存放数据字节的顺序不同,所以通信双方必须协商出统一的存放字节顺序,这样才能发送方的数据可以被接收方准确无误的读取,否则接收方读到的是一堆不知名的数据,所以通信前双方必须协商统一的用网络字节顺序,保证通信的正常进行

基于消息的异步套接字

两种模式 (Windows套接字在两种模式下执行I/O操作)

阻塞     在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)

非阻塞    在非阻塞模式下,Winsock函数无论如何都会立即返回

消息驱动

Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略

Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息

C/S模式 

相关函数

[][][][]

Win32 API 相关套接字常用函数

[][][][][][][][]

套接字版本协商

函数原型

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );

参数说明

wVersionRequested:  用来指定准备加载的Winsock库的版本.高字节位指定所需要的Winsock库的副版本,而低字节则是主版本.通常版本为2.1其中2为主版本,1为副版本号

lpWSAdata:            这是一个返回值,指向WSADATA结构的指针,WSAStartup函数用其来加载的库版本有关的信息填在这个结构中

返回值

如果Ws_32.dll或底层网络子系统没有正确初始化或被找到,函数返回WSASYSNOTREADY.

如果请求的版本低于Winsock动态库所支持的最低版本,WSAStartup函数将返回WSAVERNOTSUPPORTED.

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66656.html