Windows Socket API 使用经验(收藏)

Windows网络编程 WSAstartup()详解 WSAstartup详解详细说明函数原型使用方法:参数说明:返回值:使用范例:参考资料: socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库文件,让该库文件当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了。 #include<WinSock2.h> //第2版本的网络库 #pragma comment(lib,"ws2_32.lib") //windows 3 阅读详情
我的Windows Socket API 使用经验
                                           文章作者:唐纲

本文是我在进行MS-Windows、HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考。本文所谈到的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  1前言本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如屏幕取词,个人防火墙等。这种API Hook技术并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总 阅读详情

相关推荐

Windows C/C++ Socket 编程

作者很懒,本文没有摘要。

Jackey_Song的博客 2256

socket编程:WSAStartup函数详解

文章目录1. 函数原型和使用2. 功能3. 参数1:`WORD wVersionRequested`4. 参数2:LPWSADATA lpWSAData5. 返回值 int 官方文档:https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastartup 1. 函数原型和使用 int WSAAPI WSAStartup( WORD wVersionRequested, LPWSADATA

超级大洋葱的博客 1万+

Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

cm4配置ros mavros连接pixhawk4 Pixhawk RPi CM4 Baseboard

baidu_41704597的博客 2096

WSAStartup( )详解

这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma comment(lib,”cv.lib“)一样,然后才能包含头文件进行各种函数的调用。当然了,socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库...

m0_37624078的博客 2万+

我的Windows Socket API 使用经验

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

tgprivate的专栏 1153

socket网络编程(2)socket操作相关函数

1、setsockopt()可以用来设置接收、发送超时 int TimeOut=30000;//设置接收超时30秒 if(setsockopt(m_SocketClientCommand,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) AfxMessageBox(_T("setso

milanleon的专栏 4042

Windows Socket API使用经验

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

1117

Windows Socket API 使用经验

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

jiangxinyu的专栏 606

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的博客 2769

Windows下的socket编程

socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信。那么socket到底是什么呢?百度百科给了以下解释所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序网络协议栈进行交互的接口。...........................

StarWang的博客 1万+

WSAStartup详解

在做计网课程设计“DNS中继服务器的实现”实验中,在相关代码中看到了该函数的出现,去网上查了下相关的资料,发现这个博主写的挺全的,是我需要的内容,因此特意转到这里,方便以后查看。 原博文链接 WSAStartup( ) 这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma co

Rex's Blog 2342

window socketAPI

windows socket函数详解 windows socket函数详解   近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识。因而产生了整理Winsock函数库的想法。以下知识点均来源于MSDN,本人只做翻译工作。虽然很多前辈都做已了此类工作,但亲力亲为总记得清楚点。   0:函数库头文件1 #include <WinSock2.

github_35352251的博客 741

Windows下的socket通信,实时发送消息

在客户端服务端进行信息交互的时候,我们经常想让他们进行实时对话,下面我将给出客户端服务器实时通信的代码,采用C语言C++混合编写,基于tcp协议,键盘输入想发送的数据,接收到数据之后,对数据进行解析。老规矩,让我们开始初始化套接字。

qq_44711805的博客 2602

「 C++ 函数 」“WSAStartup()使用”讲解

一.前言 当我们进行socket编程时,要调用各种socket函数,而且还需要用到一个库文件 Ws2_32.lib 和一个头文件 Winsock2.h。 二.讲解 1.函数的功能 WSAStartup()函数 int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ...

Robot_Starscream的博客 6317

突破编程_C++_网络编程(Windows 套接字(API 接口(1)))

C++ 网络编程:Windows 套接字(API 接口(1))

突破编程 1606

智能交通实战:基于YOLOv5/8/10的车辆违章行为检测系统(违停/压线/逆行识别)

在开始模型训练前,我们得明确要检测的违章行为,还要准备好对应的数据集,这就像做饭前要确定做什么菜、准备什么食材一样。通过本指南,你已经掌握了从技术选型(YOLOv5/8/10)数据准备模型训练到UI界面开发的全流程,搭建了一套完整的车辆违章行为检测系统。这个系统在实际应用中,能有效识别多种车辆违章行为,检测准确率高、速度快,可用于智能交通管理、停车场管理等多个场景。随着深度学习技术的不断进步,YOLO系列模型在车辆违章检测领域的应用会越来越广泛。

m0_71589036的博客 436

红色警戒98版(RA95加强版)

运行说明:亲测Win10、Win11等系统可运行(直接运行,游戏默认全屏,无需模拟器或虚拟机等),运行文件中的ra95.exe或RedAlertLauncher.exe即可。【简介】RA98是一款经典的RST即时战略游戏,是基于《红色警戒95》制作的一个MOD版本。延续红警95的经典玩法,在95红警(Ra95)基础上有较大改动,包括战役数量、主线任务、地图设计(包括自制地图)以及画面优化等,另外在建筑物、兵种种类、兵种属性、建造时间、威力等方面都有大幅改动,可玩性得到极大提升。这个版本保留了《红色警戒》的核心玩法,在原版的基础上进行了强化和改进,增加了更多的单位和建筑,提升了游戏的难度和可玩性。同时加入了一些新的兵种和任务剧情等,使得游戏更加丰富多彩。玩家可以选择不同的国家,每个国家都有其独特的单位和战术。

上一篇: Windows平台下的多线程编程(收藏)
下一篇: Visual C++ 6.0的文档/视结构
aheadyes
博客等级 码龄23年 5粉丝 4原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值