Windows Socket API 使用经验

windows socket api函数大全 这些 API适用于TCP/IP协议簇,支持 面向连接Stream (TCP) 及 面向无连接Datagram (UDP) Socket。 立即下载
本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 

一、WSAStartup函数 
int WSAStartup( 
WORD wVersionRequested, 
LPWSADATA lpWSAData 
); 
使用Socket的 程序 在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明 程序 请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用 程序 调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用 程序 中。以后应用 程序 就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。 
例:假如一个 程序 要使用2.1版本的Socket,那么 程序 代码如下 
wVersionRequested = MAKEWORD( 2, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData ); 

二、WSACleanup函数 
int WSACleanup (void); 
应用 程序 在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 

三、socket函数 
SOCKET socket( 
int af, 
int type, 
int protocol 
); 
应用 程序 调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用 程序 使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用 程序 所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一个创建流套接字的例子: 
struct protoent *ppe; 
ppe=getprotobyname("tcp"); 
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto); 

四、closesocket函数 
int closesocket( 
SOCKET s 
); 
closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。 
closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。 

五、send函数 
int send( 
SOCKET s, 
const char FAR *buf, 
int len, 
int flags 
); 
不论是客户还是服务器应用 程序 都用send函数来向TCP连接的另一端发送数据。客户 程序 一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户 程序 发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用 程序 要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR) 
注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 

六、recv函数 
int recv( 
SOCKET s, 
char FAR *buf, 
int len, 
int flags 
); 
不论是客户还是服务器应用 程序 都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用 程序 调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。 
注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 

七、bind函数 
int bind( 
SOCKET s, 
const struct sockaddr FAR *name, 
int namelen 
); 
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务 程序 必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户 程序 一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的: 
struct sockaddr { 
u_short sa_family; 
char sa_data[14]; 
}; 
sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET。当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构: 
struct sockaddr_in { 
short sin_family; 
u_short sin_port; 
struct in_addr sin_addr; 
char sin_zero[8]; 
}; 
其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数inet_addr()把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务 程序 在为其Socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户 程序 都能与该服务 程序 通信;如果只给运行在多宿主机上的服务 程序 的Socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户 程序 才能与该服务 程序 通信。我们用0来填充sin_zero数组,目的是让sockaddr_in结构的大小与sockaddr结构的大小一致。下面是一个bind函数调用的例子: 
struct sockaddr_in saddr; 
saddr.sin_family = AF_INET; 
saddr.sin_port = htons(8888); 
saddr.sin_addr.s_addr = htonl(INADDR_ANY); 
bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr)); 

八、listen函数 
int listen( SOCKET s, int backlog ); 
服务 程序 可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。 

九、accept函数 
SOCKET accept( 
SOCKET s, 
struct sockaddr FAR *addr, 
int FAR *addrlen 
); 
服务 程序 调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。下面是一个调用accept的例子: 
struct sockaddr_in ServerSocketAddr; 
int addrlen; 
addrlen=sizeof(ServerSocketAddr); 
ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen); 

十、connect函数 
int connect( 
SOCKET s, 
const struct sockaddr FAR *name, 
int namelen 
); 
客户 程序 调用connect函数来使客户Socket s与监听于name所指定的计算机的特定端口上的服务Socket进行连接。如果连接成功,connect返回0;如果失败则返回SOCKET_ERROR。下面是一个例子: 
struct sockaddr_in daddr; 
memset((void *)&daddr,0,sizeof(daddr)); 
daddr.sin_family=AF_INET; 
daddr.sin_port=htons(8888); 
daddr.sin_addr.s_addr=inet_addr("133.197.22.4"); 
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));
windows_socket_api_函数大全 立即下载

相关推荐

winsocket api

包含winsocket 1.1和winsocket 2.2的api详细说明文档,pdf格式。

【Windows编程】Windows Socket API介绍

01、目录 目录01、目录02、浅谈Socket(套接字)03、浅谈TCP/IP七层模型04、浅谈三次握手,四次挥手05、Socket API介绍5.1 WSAStartup5.2 WSAClearup5.3 socket5.4 closesocket5.5 bind5.6 Listen5.7 accept5.8 connect5.9 send5.10 recv06、附录07、总结 02、浅谈Socket(套接字) socket(插座)编程是一门技术,它主要是在网络通信中经常用到。英文单词意思是“插座”。

Cain Xcy的博客 2773

fMRI脑影像特征提取——Pearson相关与低阶功能连接LOFC(dpabi+nilearn)

一个连接由节点和连接强度(边)组成。功能连接中的节点可以是单个体素,也可以是由脑图谱定义的脑区ROI。通常的做法是将脑图谱中多个或者全部ROI作为节点,或者是将脑图谱中单个ROI与全脑体素作为节点。定义连接强度(边),最常用的方式是Pearson相关,两个节点之间可能没有物理连接,但如果他们的BOLD信号同步性很强,则它们之间可能存在很强的功能上的协作,即很强的功能连接,这是一个很好的表征两个节点间关系的特征。

意疏的学习笔记 2万+

socket api 基础

本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 一、WSAStartup函数 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); 使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其

456

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 441

windows socket api 封装

#ifndef __WINSOCK_UTIL_H__ #define __WINSOCK_UTIL_H__ #include #pragma comment(lib, "Ws2_32.lib") int WinSock_Startup(int nVerHigh, int nVerLow) { WORD wVersionRequested; WSADATA wsaData; int n

学习,思考,记录 832

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 323

WINDOWS环境下SOCKET基本函数

(1)WSAStartup函数int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程

FlowShell的专栏 1124

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略

本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。

weixin_29214559的博客 518

ADS RFpro 射频阻抗仿真步骤

导入器件后,在库里面选取器件的对应模型,如图所示我们选取10pf 系统自带的村田模型。选取网络上的器件,拖入到下面component Models。导入成功后,截取需要仿真的区域(不截取仿真时间会非常长),可以生成对应如下原理图,通过原理图继续调整仿真。图上找到需要仿真链路上的网络,右键设置为信号。的叠层信息,按照PCB板厂提供信息填写完整。选择仿真的频率范围和频点数,生成如下图的RFPro仿真界。,然后再把GND也添加到下面。按图设置截取需要仿真的部分。添加成功后 网络就有了,15 双击run开始仿真。

m0_72954480的博客 3217

我的Windows Socket API 使用经验

                                       我的Windows Socket API 使用经验                                           文章作者:唐纲本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windo

tgprivate的专栏 1157

【第1章>第9节】基于FPGA的图像开运算处理算法的Verilog实现

本文介绍了基于FPGA的开运算图像处理实现方法。主要内容包括:1)输入图像二值化处理,通过阈值将灰度图像转换为二值图像;2)数据缓存与窗口提取,使用寄存器数组缓存5行图像数据并构建5×5处理窗口;3)腐蚀运算逻辑,判断窗口内是否全为白色像素;4)膨胀运算逻辑,检测窗口内是否存在白色像素。最后给出了Verilog实现方案,通过级联腐蚀和膨胀模块完成开运算处理。该方法可用于FPGA图像处理算法开发。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 315

Windows Socket API使用经验

本文是我在进行MS-Windows网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 1、WSAStartup函数   int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );   使用Socket的程序在使用Socket之前必须调用W

1119

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Windows Socket API 使用经验(收藏)

我的Windows Socket API 使用经验                                           文章作者:唐纲本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。一、WSAStartup函数    int WSASt

aheadyes的专栏 754

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Windows Socket API使用经验--转

本文是我在进行MS-Windows网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 1、WSAStartup函数   int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );   使用Socket的程序在使用Socket之前必须调用W

kevin2hy 941

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINDOWS SOCKET API 使用经验

http://www.ddvip.net/program/vc/index7/13.htm本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 一、WSAStartup函数 int WSAStartup( WORD wVersionRequested, L

505
上一篇: 内存错误代码一览
下一篇: int ,long , long long,int32_t,int64_t 类型表示范围
岚尘
博客等级 码龄18年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值