《ASCE1885的网络编程》---Windows API基本函数の套接口与连接的建立

判断两个多边形是否相交(java实现) 判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景 阅读详情

1)打开Winsock---WSAStartup()

使用Winsock API编制的网络应用程序中,在调用任何一个Winsock函数之前,都必须检查协议栈的安装情况,也就是检查系统中是否有Windows Sockets的实现库。调用的是WSAStartup函数,详见:《Windows API巡礼》---WSAStartup和WSACleanup(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710430.aspx )。

 

2)创建套接口---socket()或WSASocket()

在Winsock1中提供的创建套接口的函数是socket,详见:《Windows API巡礼》---socket和bind(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710521.aspx )。

 

在Winsock2中提供的该函数的扩展格式是WSASocket:

SOCKET WSASocket(

  __in  int af, //使用的协议地址族,一般是AF_INET

  __in  int type, //协议类型,当af=AF_INET时,

//取值为:SOCK_STREAM、SOCK_DGRAM或SOCK_RAW之一

  __in  int protocol, //取值由type决定,详见下表…

  __in  LPWSAPROTOCOL_INFO lpProtocolInfo, //一个指向WSAPROTOCOL_INFO结构的指针,

                   //该结构定义所创建套接口的特性。如果本参数不指向NULL,则前三个参数被忽略

                   //系统将根据该结构中三个字段的值确定套接口类型

  __in  GROUP g, //套接口组的描述字,该参数始终为0,因为目前尚无可支持套接口组的Winsock版本

  __in  DWORD dwFlags //套接口属性描述,可取值如下:

                   //WSA_FLAG_OVERLAPPED、WSA_FLAG_MULTIPOINT_C_ROOT…

);

其中WSA_FLAG_OVERLAPPED用于指定这个套接口具备重叠I/O的特性,调用socket()建立一个套接字时,WSA_FLAG_OVERLAPPED便是默认设置。

 

函数调用成功,返回新创建的套接口号,它被定义成一个无符号的整型数据;调用失败,返回INVALID_SOCKET,调用WSAGetLastError()可获取相应错误代码。

 

附表:套接口参数

 

以下实例演示了WSASocket函数的使用:

#include <windows.h>

#include <winsock2.h>

#include <stdio.h>

 

#pragma comment(lib,"ws2_32.lib")

 

int main()

{

    WSADATA wsaData;

    SOCKET recvSocket;

   

    int iResult;

   

    //-----------------------------------------------

    // Initialize Winsock

    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

    if(iResult != 0)

    {

        printf("WSAStartup failed: %d/n", iResult);

        return 1;          

    }

   

    //-----------------------------------------------

    // Initialize Winsock

    recvSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP,

                     NULL, 0, WSA_FLAG_OVERLAPPED);

    if(recvSocket == INVALID_SOCKET)

    {

        printf("WSASocket call failed with error : %d/n", WSAGetLastError());

        WSACleanup();

        return 1;

    }

   

    printf("WSASocket call success!/n");

    system("pause");

    return 0;

}

 

3)指定本地地址---bind()

详见:《Windows API巡礼》---socket和bind(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710521.aspx )。

 

4)监听连接---listen()

详见:《Windows API巡礼》---listen、accept和connect(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710696.aspx )。

 

5)请求连接---connect()或WSAConnect()

在Winsock1中提供的connect()函数详见:《Windows API巡礼》---listen、accept和connect(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710696.aspx )。

 

在Winsock2中提供的扩展格式是WSAConnect:

int WSAConnect(

  __in   SOCKET s, //将要建立连接的套接口描述字

  __in   const struct sockaddr *name, //指向远端套接口地址结构的指针

  __in   int namelen, //name名字的长度

  __in   LPWSABUF lpCallerData, //指向用户数据缓冲区的一个指针,该缓冲区中包含有在建立连接时

                            //由本机传输到服务器端的数据

  __out  LPWSABUF lpCalleeData, //指向另一个用户数据缓冲区的指针,该缓冲区中包含在建立连接时

                            //从服务器端传送到本机的数据

  __in   LPQOS lpSQOS, //指向服务质量(QOS)结构的指针,它用于指定流式套接口s需要的服务质量

  __in   LPQOS lpGQOS //指向服务质量(QOS)结构的指针,

//它指出套接口组所需要的服务质量;目前总为NULL

);

 

WSABUF是一种在Winsock2中很常用的结构,定义如下:

typedef struct __WSABUF {

  u_long   len; //

  char FAR *buf; //

} WSABUF, *LPWSABUF;

 

QOS结构定义如下:

typedef struct _QualityOfService {

  FLOWSPEC SendingFlowspec;

  FLOWSPEC ReceivingFlowspec;

  WSABUF   ProviderSpecific;

} QOS, *LPQOS;

 

函数调用成功返回0,否则返回INVALID_SOCKET错误;

对于阻塞套接口来说,返回值表示连接试图是否成功;

对于非阻塞套接口来说,连接试图不一定马上成功。在这种情况下,WSAConnect()返回SOCKET_ERROR,且WSAGetLastError()返回WSAEWOULDBLOCK,此时应用程序可以采用下面方法进一步做出判断:

1)  利用select()函数,通过检查套接口是否可写来判断连接请求是否完成;

2) 如果应用程序已使用WSAAsyncSelect()函数来确定对连接事件的兴趣,则当连接操作完成时应用程序将收到FD_CONNECT通知;

3) 如果应用程序已使用WSAEventSelect()函数来确定对连接事件的兴趣,则当连接操作完成时相应的事件对象将设置信号。

对于一个非阻塞套接口来说,在连接试图完成之前,任何对套接口的WSAConnect()调用都将以WSAEALREADY错误返回;如果返回值指出连接试图失败(例如WSAECONNREFUSED、WSAENETUNREACH、WSAETIMEOUT),则应用程序可对该套接口再次调用WSAConnect()函数。

 

6)接受连接---accept()和WSAAccept()

在Winsock1中提供的accept()函数详见:《Windows API巡礼》---listen、accept和connect(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710696.aspx )。

 

在Winsock2中提供的accept()函数的扩展格式是WSAAccept():

SOCKET WSAAccept(

  __in     SOCKET s, //一个处于监听连接状态的套接口描述字

  __out    struct sockaddr *addr, //用于存放发出连接请求的客户端IP地址信息

  __inout  LPINT addrlen, //addr结构长度

  __in     LPCONDITIONPROC lpfnCondition, //指向条件函数进程的指针

  __in     DWORD dwCallbackData //作为条件函数参数返回给应用程序的回调数据,

//Winsock不分析该参数

);

其中lpfnCondition指向的函数是根据客户的请求来调用的,该函数决定是否接受客户的连接请求,定义如下:

int CALLBACK ConditionFunc(

  IN LPWSABUF lpCallerId, //指出客户连接实体的地址

  IN LPWSABUF lpCallerData, //由客户在连接请求中发来的数据

  IN OUT LPQOS lpSQOS, //指定一个客户连接请求的服务质量

  IN OUT LPQOS lpGQOS, //指定套接口组的服务质量

  IN LPWSABUF lpCalleeId, //指出本地连接实体的地址

  OUT LPWSABUF lpCalleeData, //建立连接时发给客户的数据

  OUT GROUP FAR *g, //确定一个组

  IN DWORD_PTR dwCallbackData //返回的数据

);

 

函数调用成功,返回一个新的套接口描述符,它对应于已经接受的那个客户机的连接。对该客户机后续的所有操作,都使用这个新的套接口描述符,一般称为已连接套接口描述符;而原来的那个监听套接口,仍然用于接收其他客户机发送的连接请求,一般称为监听套接口描述符。

函数调用失败,返回INVALID_SOCKET错误,调用WSAGetLastError()获取相应错误代码。

 

注意:该函数用于面向连接的服务器端,在IP协议族中,只用于TCP服务器端。

 

以下代码演示了WSAAccept函数的使用:

#include <winsock2.h>

#include <stdio.h>

#include <windows.h>

 

/* Define an example conditional function that depends on the pQos field */

int CALLBACK ConditionAcceptFunc(

    LPWSABUF lpCallerId,

    LPWSABUF lpCallerData,

    LPQOS pQos,

    LPQOS lpGQOS,

    LPWSABUF lpCalleeId,

    LPWSABUF lpCalleeData,

    GROUP FAR * g,

    DWORD_PTR dwCallbackData

    )

{

 

    if (pQos != NULL) {

        RtlZeroMemory(pQos, sizeof(QOS));

        return CF_ACCEPT;

    } else

        return CF_REJECT;

}

 

 

int main() {

 

    /* Declare and initialize variables */

    WSADATA wsaData;

    SOCKET ListenSocket, AcceptSocket;

    struct sockaddr_in saClient;

    int iClientSize = sizeof(saClient);

    u_short port = 27015;

    char* ip;

    sockaddr_in service;

    int error;

 

    /* Initialize Winsock */

    error = WSAStartup(MAKEWORD(2,2), &wsaData);

    if (error) {

        printf("WSAStartup() failed with error: %d/n", error);

        return 1;

    }

 

    /* Create a TCP listening socket */

    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (ListenSocket == INVALID_SOCKET) { 

        printf("socket() failed with error: %d/n", WSAGetLastError() );

        WSACleanup();

        return 1;

    }

 

    /*-------------------------------------------------------------

     *  Set up the sock addr structure that the listening socket

     *  will be bound to. In this case, the structure holds the

     *  local IP address and the port specified.                       */

    service.sin_family = AF_INET;

    service.sin_port = htons(port);

    hostent* thisHost;

    thisHost = gethostbyname("");

    ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);

    service.sin_addr.s_addr = inet_addr(ip);

 

    /*-------------------------------------------------------------

     *  Bind the listening socket to the IP address.

     *  and port number specified by the sockaddr structure. */

    error = bind(ListenSocket, (SOCKADDR *) &service, sizeof(SOCKADDR));

    if (error == SOCKET_ERROR) { 

        printf("bind() failed with error: %d/n", WSAGetLastError() );

        closesocket(ListenSocket);

        WSACleanup();

        return 1;

    }

 

 

    /* Make the socket listen for incoming connection requests */

    error = listen(ListenSocket, 1);

    if (error == SOCKET_ERROR) { 

        printf("listen() failed with error: %d/n", WSAGetLastError() );

        closesocket(ListenSocket);

        WSACleanup();

        return 1;

    }

    printf("Listening.../n");

 

 

    /*-------------------------------------------------------

     *  Accept an incoming connnection request on the

     *  listening socket and transfer control to the

     *  accepting socket.                                                                                            */

    AcceptSocket = WSAAccept(ListenSocket, (SOCKADDR*) &saClient, &iClientSize,

        &ConditionAcceptFunc, NULL);

 

    /*  Now do some work with the AcceptSocket

     *  At this point, the application could

     *  handle data transfer on the socket, or other socket

     *  functionality.                                                        */

   

    /* Then clean up and quit */

 

    closesocket(AcceptSocket);

    closesocket(ListenSocket);

    WSACleanup();

 

    return 0;

}

 

 

 

 

【sealos安装指南】基于 Sealos 安装 Kubernetes 1.33.6 高可用集群 本文介绍使用Sealos工具快速搭建Kubernetes集群的详细指南。Sealos简化了K8s部署流程,自动完成系统调优,适合新手学习使用。文章提供了服务器规划、环境准备、在线/离线两种安装方式的具体步骤,包括主机名设置、swap关闭、数据目录配置等。重点讲解了Sealos的安装命令参数说明,以及添加/删除节点等常用操作。推荐使用Calico网络组件确保稳定性,并附有安装成功后的验证截图。该指南能帮助用户快速搭建一个包含master和worker节点的K8s集群,底层基于containerd运行。 阅读详情

相关推荐

单片机控制双向可控硅的5种实用触发电路设计(附完整电路图)

本文深入解析了单片机控制双向可控硅的5种实用触发电路设计,涵盖从基础隔离到复杂负载驱动的实战方案。重点探讨了光电耦合器选型、过零检测同步、RC吸收电路精密计算以及应对感性负载和高噪声环境的加固策略,并提供了完整的电路图与调试避坑指南,旨在帮助开发者实现安全可靠的交流负载控制。

joy55的博客 2206

[网络基础知识]File协议--本地文件传输协议

协议 啥叫协议-schema,规定你干啥他干啥我干啥,每个人不能乱来,和谐共处 使用File协议 基本的格式:file:///文件路径 比如要打开F盘flash文件夹中的1.swf文件,那么可以在资源管理器或浏览器地址栏中输入:file:///f:/flash/1.swf回车 uri中为什么本地文件file后面跟三个斜杠, http等协议跟两个斜杠? 因为URI结构是:sche...

超越 4868

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

TCP Socket通信学习

学习内容,参见《Windows网络编程》 第7章 Winsock基础 服务器/客户端连接模型见下图。 服务端流程 用socket或WSASocket创建一个套接字。用bind绑定套接字到本地IP地址(多网卡时,本地有多个IP)。用listen将套接字置为监听模式。通过accept或WSAAccept来接受客户连接。用send或WSASend发送信息,用recv或WSARecv

Segen_Jaa的专栏 3738

MIT-BEVFusion系列六--bevfusion网络部分流程理解

简述bevfusion网络部分

duanmushuangquan的博客 4892

工业自动化中气动夹爪选型、调试与维护全流程实战解析

在工业自动化领域,气动执行元件是实现精准抓取与搬运的基础。其工作原理是通过压缩空气驱动气缸,转化为直线或旋转运动,从而控制夹爪的开合。这类技术因其结构简单、响应快速、成本低廉及维护方便,在自动化产线中具有极高的技术价值,是实现高效、可靠物料搬运的核心单元。其典型应用场景涵盖电子装配、汽车制造、食品包装等行业的上下料、分拣与定位工序。本文以工业自动化中常见的二指平行气动夹爪(常被工程师代号化为“Gripper-A”)为例,深入剖析其从硬件选型、气动系统集成到程序逻辑联锁的完整工程实践。内容聚焦于夹持力计算中惯

weixin_42629671的博客 366

《windows网络编程》笔记,也适合linux

第一部分:传统网络API第1章:NetBIOS(NerWork Basic Input/Output System, NetBIOS)是一种标准的应用程序编程接口“网络基本输入/输出系统”:NetBIOS提供了异步调用,同时兼容于较老的操作系统。OSI模型:应用层:       为用户提供相应的界面,以便使用提供的连网功能表示层:       完成数据的格式化会话层

xinxun的地盘 2457

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

黑猫带你学eMMC协议第7篇:全网最全emmc写保护详解(write protect) 黑猫带你学eMMC协议第8篇:emmc可靠写详解(Write Reliability) 黑猫带你学eMMC协议第9篇:emmc的分区配置(partitioning) 黑猫带你学eMMC协议第10篇:eMMC命令队列详解(CMDQ) 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim…) 黑猫带你学eMMC协议第12篇:

黑猫奥利奥的博客 2万+

[C++]-Windows下Socket连接之客户端

连接接收发送 在《[C++]-Windows下Socket连接之服务端》中介绍了Windows下Socket编程的一些基本知识与服务端实现,现在介绍一下客户端的实现。相比于服务端,客户端流程相对简单些,主要就是: 连接服务端; 收发消息 此客户端实现,除发送接口外,其他的都使用IOCP(I/O Completion Port,I/O完成端口)接口WSAXXX。IOCP是性能良好的I/O模型,可以支持大并发(通过完成端口,避免大量线程的创建),更适合在服务端使用。 等待服务端应答及退出

飞鹰技术 1045

uni-app - 实现全屏自适应且不变形背景大图,设置一张图片占满全屏(根据手机或电脑尺寸自动拉伸背景图像),用于页面是一张平铺的大图做背景的情况,全端兼容

uni-app,vue.js,微信小程序-设置背景图自适应手机屏幕尺寸,页面中的背景图片高度和宽度自适应,UNI-APP里如何设置背景图自适应手机屏幕尺寸,如何实现一个图片铺满整个页面,并且可以根据用户机型进行自动修正,自适应背景大图片官方教程,一个页面如何将图像放到背景上,纯CSS实现,设置背景图片占满全屏,3种CSS实现背景图片全屏铺满自适应的方式,uni-app中如何让图片不带高度的自适应,兼容uni-app全端,支持【纯】微信小程序项目使用,uni-app-实现全屏自适应且不变形背景大图

🏆 前端领域优质创作者 1万+

2026爬虫反爬终极对抗:AST解混淆+算法还原+Python复现全流程实战

本文分享了破解JS加密参数的完整流程,重点介绍AST解混淆和算法还原方法。针对电商网站常见的混淆手段(变量名混淆、控制流平坦化、字符串加密等),作者提出一套高效解决方案:通过AST解析还原可读代码,结合Chrome断点调试定位加密函数,最后用Python精准复现加密逻辑。文章包含具体的代码实现,如字符串数组还原的AST操作示例,并详细说明了从样本采集到验证测试的全流程。该方法已成功应用于10多个网站,将破解时间从一周缩短至一天,为处理JS加密参数提供了可复用的技术方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1523

网络编程基础知识学习要点记录

1、网络中通信的两个进程可以用以下五元组标识:  (协议(TCP/UDP),本地IP地址,本地端口号,远程IP地址,远程端口号) 2、在Windows下的网络应用程序编程接口叫Windows Sockets,简称WinSock。 3、套接口(Socket):Windows Sockets API依靠套接口进行通信。 4、WinSock API基本函数: (1)套接口与连接的建立:

u010236780的专栏 702

24、无人机能耗模型与上下文质量管理的研究

本文系统介绍了无人机能耗模型与上下文质量管理的研究进展。详细阐述了Dorling、Stolaroff、Kirchstein和Tseng等经典能耗模型的原理及特点,并基于LSTM架构构建了数据驱动的能耗预测模型,实验表明其预测精度显著优于传统模型。此外,还探讨了物联网环境中的上下文质量管理问题,引入了conQeng框架,以提升上下文选择、测量和验证的效率与可靠性。研究为无人机能耗优化和物联网上下文管理提供了理论支持和技术方案。

palm99的专栏 344

《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数

《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数 2010年08月03日   在Windows环境下,套接口的通信方式分为两种:阻塞方式和非阻塞方式。阻塞方式下工作的套接口在进行I/O操作时,函数要等待到相关操作完成以后才能返回;非阻塞方式下工作的套接口在进行I/O操作时,无论操作是否成功,调用都会立即返回。   阻塞方式和非阻塞方式各有优缺点,阻塞方...

xvn57xvn 160

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

《ASCE1885的网络编程》の套接字select模型

《ASCE1885的网络编程》の套接字select模型 2010年10月15日   套接字Select模型使得Windows Sockets应用程序可以在同一时间内管理和控制多个套接字。该模型的核心是select()函数,在使用该函数时,还需要用到FD_SET、FD_ZERO、FD_ISSET和FD_CLR四个宏。   套接字的select模型,能够使得Windows Sockets...

cq112cq 156

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Windows Sockets 2扩展库函数简要参考

1 WSAAccept()简述:根据条件函数的返回值有条件地接受连接,同时(可选地)创建和/或加入一个套接口组。           SOCKET WSAAPI WSAAccept ( SOCKET s, struct          sockaddr FAR * addr, int FAR * addrlen,          LPCONDITIONPROC lpfnCondition, D

深之JohnChen的专栏 3230

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 《ASCE1885的网络编程》---Winsock API基本函数の数据传输
下一篇: 《算法之美》の链表问题の从尾到头输出链表
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值