1、套接字概述
套接字是网络通信的基石,是网络通信的基本构件。
所谓套接字,实际上是一个指向传输提供者的句柄。在WinSock中,就是通过操作该句柄来实现网络通信和管理的。根据性质和作用不同,套接字可以分为原始套接字、流式套接字、数据包套接字3种。
(1)原始套接字:原始套接字是在WinSock2规范中提出的,他能够使程序开发人员对底层的网络传输机制进行控制,在原始套接字下接受的数据中包含IP头
(2)流式套接字:流式套接字提供双向、有序、可靠的数据传输服务,该类型套接字在通信前需要双方建立连接。TCP协议采用的就是流式套接字。
(3)数据包套接字:数据报套接字提供双向的数据流,但是它不能保证数据传输的可靠性、有序性、和无重复性。UDP协议采用就是数据包套接字。
2、TCP套接字的socket编程
TCP是面向连接的、可靠的传输协议。通信双方建立连接就可以利用TCP进行通信。TCP提供了数据确认和数据重传的机制,保证了发送的数据一定能到达通信的对方。
基于TCP面向连接的socket编程的服务器端程序流程如下:
(1)创建套接字socket。
(2)将创建的套接字绑定(bind)到本地的地址和端口上
(3)设置套接字的状态为监听状态(listen),准备接受客户端的连接请求。
(4)接受请求(accpet),同时返回得到一个用于连接的新套接字。
(5)使用这个新套接字进行通信(通信函数使用send/recv)。
(6)通信完毕,释放套接字资源(closesocket)。
基于TCP面向连接的socket编程的客户端程序流程如下:
(1)创建套接字socket。
(2)向服务器发送连接请求(connect)
(3)请求连接后与服务器进行通信操作(send/recv)
(4)释放套接字资源(closesocket)
3、UDP的套接字的socket编程
UDP是无连接的、不可靠的传输协议。采用UDP进行通信时,不需要建立连接,可以直接向一个IP地址发送数据,但是不能保证对方能收到。可以把服务器称为接收端,客服端就是发送数据的发送端。
基于UDP面向无连接的socket编程的发送端程序流程如下:
(1)创建套接字socket
(2)将套接字绑定(bind)带一个本地地址和端口上
(3)等待接收数据(recvfrom)
(4)释放套接字资源(closesocket)
基于UDP面向无连接的socket编程的接收端程序流程如下:
(1)创建套接字socket
(2)向服务器发送数据(sendto)
(3)释放套接字资源(closesocket)
4、套接字函数介绍
(1)WSAStartup函数:初始化套接字库。其原型如下:
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
注意:WSAStartup函数用于初始化Ws2_32.dll动态链接库。在使用套接字函数之前,一定要初始化Ws2_32.dll动态链接库。
说明:1)wVersionRequested:表示调用者使用的Windows socket的版本,该字节记录修订版本,低字节记录主版本。例如版本2.1,则高字节记录1,低字节记录2
2)lpWSAData:是一个WSADATA结构指针,该结构详细记录了Windows套接字的相关信息。其定义如下:
typedef struct WSAData
{
WORD wVersion;
WORD wHighVersion;
char szDwscription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STAUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR* lpVendorlnfo;
}WSADATA,FAR*LPWSADATA;
(2)socket函数:创建一个套接字
SOCKET socket(int af,int type,int protocol);
说明:1)af:表示一个地址家族,通常为AF_INET
2)type:表示套接字类型,如果未SOCK_STREAM,表示创建面向连接的流式套接字;为SOCK_DGRAM,表示创建面向无连接的数据报套接字;SOCK_RAW,表示创建原始套接字。对于这些值,用户可以在Winsock2.h头文件中找到
3)potocol:表示套接口所用的协议,若果用户不指定,可以设置为0
4)返回值:创建的套接字句柄
(3)bind函数:将套接字绑定到指定的端口和地址上。
int bind(SOCKET s,const stuct sockaddr FAR* name,int namelen);
说明:
1)s:表示套接字标识
2)name:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号
3)namelen:确定name缓冲区的长度
4)返回值:如果函数执行成功,则返回值为0,否则为SOCKET_ERROR
(4)listen函数:将嵌套字设定为监听模式。对于流式套接字,必须处于监听模式才能够接收客户端套接字的连接。
int listen(SOCKET S,int backlog);
说明:
1)s:表示套接字标识
2)backlog:表示等待连接的最大队列长度。
(5)accept函数:接受客户端的连接。在流式套接字中,只有在套接字处于监听状态,才能接受客户端的连接。
SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);
说明:
1)s:表示套接字标识
2)addr:是一个sockddr_in结构指针,包含一组客户端的端口号、IP地址等信息。
3)addrlen:用于接收参数addr的长度
(6)closesocket函数:关闭套接字
int closesocket(SOCKET s);
(7)connect函数:发送连接请求
int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);
说明:
1)s:表示套接字标识
2)name:表示套接字s要连接的主机地址和端口号
3)namelen:是neme缓冲区的长度
4)返回值:执行成功,返回值为0,否则放回SOCKET_ERROR.用户可以通过WSAGETLASTERROR得到其错误描述
(8)htons函数:将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式
u_short htons(u_short hostshort);
说明:
1)hostshort:是一个主机排列方式的无符号短整型数据
2)返回值:函数返回值是16位的网络排列方式数据
(9)htonl函数:将一个无符号长整型数据由主机排列方式转换为网络排列方式
u_long htonl(u_long hostlong);
说明:
1)hostlong:表示一个主机排列方式的无符号长整型数据
2)返回值:32位的网络排列方式数据
(10)inet_addr函数:将一个由字符串表示的地址转换为32位的无符号长整型数据
unsigned long inet_addr(const char FAR* cp);
说明:
1)cp:表示一个IP复制的字符串
2)返回值:32位无符号整数
(11)recv函数:从面向连接的套接字中接收数据
int recv(SOCKET s,char FAR* BUF,int len,int,flags);
说明:
1)s:表示套接字标识
2)buf:接收数据的缓冲区
3)len:buf的长度
4)flags:函数的调用方式。如果未MSG_PEEK,则表示查看传来的数据,在序列前端的数据会被复制一份到缓冲区中,但是这个数据不会从序列中移走;如果是MSG_OOB,则表示用来处理Out-Of-Band数据,也就是外带数据。
(12)send函数:在面向连接方式的套接字间发送数据。
int send(SOCKET s,const char FAR* buf,int len,int flags);
说明:
1)s:表示套接字标识
2)buf:表示存放要发送数据的缓冲区
3)len:缓冲区长度
4)flags:函数的调用方式
(13)recvfrom函数:接收一个数据报信息并保存源地址
int recvfrom(SOCKET s,char FAR* buf,int len,int flags, struct sockaddr FAR* from,int FAR* fromlen);
说明:
1)s:表示套接字标识
2)buf:指向缓冲区的指针,用来接收数据
3)len:缓冲区的长度
4)flags:通过设置这个值可以影响函数调用的行为
5)from:是一个指向地址结构的指针,用来接收发送数据防的地址信息
6)fromlen:表示缓冲区的长度
(14)sendto函数:向一个特定的目的方发送数据
int sendto(SOCKET s,const char FAR* buf,int len,int flags,const struct sockaddr FAR* to,int tolen);
说明:
1)s:表示一个(可能已经建立连接的)套接字标识
2)buf:指向缓冲区的指针,该缓冲区包含将要发送的数据
3)len:表示缓冲区的长度
4)flags:通过设置这个值可以影响函数的调用行为
5)to:指定目标调节子的地址
6)tolen:表示缓冲区的长度
(15)WSACleanup函数:释放为Ws2_32.dll动态链接库初始化时分配的资源
int WSACleanup(void);
使用该函数关闭动态链接库:
WSACleanup();
《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字相关推荐
- 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(上)——网络
1.IP地址 每台计算机都需要一个IP地址以识别自己,IP地址由IP协议规定的32位的二进制表示,最新的IPV6协议将IP地址提升为128位,但还不能广泛应用. 32位的IP地址主要分为前缀和后最两部 ...
- 《c语言从入门到精通》看书笔记——第14章 文件
1.文件的基本操作 (1)文件指针 文件指针是指向文件有关信息的指针,这些信息包含文件名,状态,和当前位置,他们保存在一个结构体变量中.在使用文件时需要在内存中为其分配空间,用以存放文件的基本信息.该 ...
- 《c语言从入门到精通》看书笔记——第13章 预处理
1.宏定义 宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制. 宏定义指令#define用来定义一个标识符和一个字符串,一这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所 ...
- 《c语言从入门到精通》看书笔记——第10章 指针
1.地址与指针 地址:就是内存区中对每个字节的编号 指针:可以看作是内存中的一个地址.在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到相应的变量,这个变量 ...
- 《c语言从入门到精通》看书笔记——第3章 数据类型
1.编程规范 (1)代码缩进:统一为4字符,用Tab (2)变量常量命名规范:常量命名统一为大写格式.如果成员变量,均以m_开始.普通变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的 ...
- 《c语言从入门到精通》看书笔记——第2章 算法
1.通常,一个程序包含算法.数据结构.程序设计方法及语言工具和环境这四个方面 2.算法的特性: 有效性.确定性.可行性.输入(一个算法应有零个获多个输入).输出(1个或多个) 3.算法的优劣: (1) ...
- 《c语言从入门到精通》看书笔记——第1章 C语言的概述
1.使用普遍的高级语言有:Fortran/ALGOL/Basic/COBOL/LISP/Pascal/PRLOLG/C/C++/VC/VB/Delphi/Java等 2. C语言是一个面向过程的语言, ...
- 《c语言从入门到精通》看书笔记——第15章 存储管理
1.内存的组织方式 程序被组织成以下4个逻辑段 (1)可执行代码 (2)静态数据.可执行代码和静态数据存储在固定的内存位置 (3)动态数据(堆).程序请求动态分配的内存来自内存池,也就是上面所列举的堆 ...
- 《c语言从入门到精通》看书笔记——第12章 位运算
1.按位运算就是对字节或字中的实际位进行检测.设置或移位. 位运算符 2.位段的概念与定义 位段类型是一种特殊的结构类型,其所有成员的长度均是以二进制位为单位定义的,结构中的成员被称为位段.位段定义的 ...
最新文章
- Window下启动MariaDB服务启动失败
- Projection with Type Hint用法
- 4位先行进位加法器_行波进位/超前进位加法器详解
- 教学思路SQL之入门习题《学生成绩》 二、基础单表查询
- 计算机中常用术语CAD是指,计算机基础知识理论复习题及答案
- Topcoder 658Div2
- ASP.NET MVC:Razor 引入命名空间
- 8 月社群专属福利活动开启!进群免费领取开发视频课程!
- 消息中间件之JMS实践(ActiveMQ) 1
- 独家 | 一文读懂语音识别(附学习资源)
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
- TMS320C55x的硬件结构
- 10个免费的web压力测试工具
- 计算机桌面怎么改为d盘,win7怎么把桌面文件夹路径改为d盘
- 关于linux系统安装zabbix报错的解决方案
- 弱水三千,只取一瓢饮 的意思
- 刚上大一,C 语言压根听不懂怎么办?
- mysql every derived table must_Mysql错误Every derived table must have its own alias解决方法
- 【金猿技术展】同盾科技知识联邦技术——3.0人工智能的坚强基石
- 页面ifream固定分辨率展示并适配所有分辨率方法
热门文章
- SAP CRM Fiori应用Appointment startup parameters - 启动参数
- How is navigation target url request handled by backend
- SAP XS Engine 里的 HANA live report metadata
- Update operation on extension field created by AET
- CRM product ID format相关配置
- 如何终止SAP cloud connector的服务
- SAP C4C客户主数据重复检查和清洗实现
- SAP S4HANA里关于生产订单的一些重要数据库表
- linux删除modules文件夹,linux – 为什么我不能删除这个dkms模块?
- 最新PHP秒赞,快乐秒赞 php版