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章 网络套接字编程(下)——套接字相关推荐

  1. 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(上)——网络

    1.IP地址 每台计算机都需要一个IP地址以识别自己,IP地址由IP协议规定的32位的二进制表示,最新的IPV6协议将IP地址提升为128位,但还不能广泛应用. 32位的IP地址主要分为前缀和后最两部 ...

  2. 《c语言从入门到精通》看书笔记——第14章 文件

    1.文件的基本操作 (1)文件指针 文件指针是指向文件有关信息的指针,这些信息包含文件名,状态,和当前位置,他们保存在一个结构体变量中.在使用文件时需要在内存中为其分配空间,用以存放文件的基本信息.该 ...

  3. 《c语言从入门到精通》看书笔记——第13章 预处理

    1.宏定义 宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制. 宏定义指令#define用来定义一个标识符和一个字符串,一这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所 ...

  4. 《c语言从入门到精通》看书笔记——第10章 指针

    1.地址与指针 地址:就是内存区中对每个字节的编号 指针:可以看作是内存中的一个地址.在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到相应的变量,这个变量 ...

  5. 《c语言从入门到精通》看书笔记——第3章 数据类型

    1.编程规范 (1)代码缩进:统一为4字符,用Tab (2)变量常量命名规范:常量命名统一为大写格式.如果成员变量,均以m_开始.普通变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的 ...

  6. 《c语言从入门到精通》看书笔记——第2章 算法

    1.通常,一个程序包含算法.数据结构.程序设计方法及语言工具和环境这四个方面 2.算法的特性: 有效性.确定性.可行性.输入(一个算法应有零个获多个输入).输出(1个或多个) 3.算法的优劣: (1) ...

  7. 《c语言从入门到精通》看书笔记——第1章 C语言的概述

    1.使用普遍的高级语言有:Fortran/ALGOL/Basic/COBOL/LISP/Pascal/PRLOLG/C/C++/VC/VB/Delphi/Java等 2. C语言是一个面向过程的语言, ...

  8. 《c语言从入门到精通》看书笔记——第15章 存储管理

    1.内存的组织方式 程序被组织成以下4个逻辑段 (1)可执行代码 (2)静态数据.可执行代码和静态数据存储在固定的内存位置 (3)动态数据(堆).程序请求动态分配的内存来自内存池,也就是上面所列举的堆 ...

  9. 《c语言从入门到精通》看书笔记——第12章 位运算

    1.按位运算就是对字节或字中的实际位进行检测.设置或移位. 位运算符 2.位段的概念与定义 位段类型是一种特殊的结构类型,其所有成员的长度均是以二进制位为单位定义的,结构中的成员被称为位段.位段定义的 ...

最新文章

  1. Window下启动MariaDB服务启动失败
  2. Projection with Type Hint用法
  3. 4位先行进位加法器_行波进位/超前进位加法器详解
  4. 教学思路SQL之入门习题《学生成绩》 二、基础单表查询
  5. 计算机中常用术语CAD是指,计算机基础知识理论复习题及答案
  6. Topcoder 658Div2
  7. ASP.NET MVC:Razor 引入命名空间
  8. 8 月社群专属福利活动开启!进群免费领取开发视频课程!
  9. 消息中间件之JMS实践(ActiveMQ) 1
  10. 独家 | 一文读懂语音识别(附学习资源)
  11. 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
  12. TMS320C55x的硬件结构
  13. 10个免费的web压力测试工具
  14. 计算机桌面怎么改为d盘,win7怎么把桌面文件夹路径改为d盘
  15. 关于linux系统安装zabbix报错的解决方案
  16. 弱水三千,只取一瓢饮 的意思
  17. 刚上大一,C 语言压根听不懂怎么办?
  18. mysql every derived table must_Mysql错误Every derived table must have its own alias解决方法
  19. 【金猿技术展】同盾科技知识联邦技术——3.0人工智能的坚强基石
  20. 页面ifream固定分辨率展示并适配所有分辨率方法

热门文章

  1. SAP CRM Fiori应用Appointment startup parameters - 启动参数
  2. How is navigation target url request handled by backend
  3. SAP XS Engine 里的 HANA live report metadata
  4. Update operation on extension field created by AET
  5. CRM product ID format相关配置
  6. 如何终止SAP cloud connector的服务
  7. SAP C4C客户主数据重复检查和清洗实现
  8. SAP S4HANA里关于生产订单的一些重要数据库表
  9. linux删除modules文件夹,linux – 为什么我不能删除这个dkms模块?
  10. 最新PHP秒赞,快乐秒赞 php版