精华内容
下载资源
问答
  • WinSock

    2014-04-18 17:21:01
    WinSock
  • winsock

    2019-10-10 16:28:15
    加载Winsock库函数 : WSAStartup 1 int WSAStartup( 2 WORD wVersionRequested,//指定想要加载的winsock库 3 LPWSADATA lpWSAData//指向 WSADATA的指针,用来返回DLL库的详细信息 4 ); WSADat头结构 1 ...

    加载Winsock库函数 : WSAStartup

    1 int WSAStartup(
    2                WORD wVersionRequested,//指定想要加载的winsock库
    3                LPWSADATA lpWSAData//指向 WSADATA的指针,用来返回DLL库的详细信息
    4 );

    WSADat头结构

    复制代码

     1 typedef struct WSAData
     2 {
     3     WORD wVersion;    //库文件建议应用程序使用的版本
     4     WORD wHighVersion;    //库文件支持的最高版本
     5     char szDescription[WSADESCRIPTION_LEN+1];    //库描述字符串
     6     char szSystemStatus[WSASYS_STATUS_LEN+1];    //系统状态字符串
     7     unsigned short iMaxSockets;    //同时支持的最大套接字的数量
     8     unsigned short iMaxUdpDg;    //2.0版中已废弃的参数
     9     char FAR* lpVendorInfo;    //已废弃的参数
    10 }WSADATA,FAR* LOWSADATA;

    复制代码

    每一个WSAStart调用必须对应一个队WSAClean的调用,这个函数用来释放winsock库

    int WSACleanup(void);

    如果想使用winsock库,应该包含对应的库文件

    1 #pragma comment(lib,"WS2_32")

    以后封装的经常用到的CInitSock类

    复制代码

     1 #include <winsock2.h>
     2 #pragma comment(lib,"WS2_32")
     3 class CInitSock
     4 {
     5 public:
     6     CInitSock(BYTE minorVer=2,BYTE majorVer=2)
     7     {
     8         WSADATA wsaData;
     9         WORD sockVersion = MAKEWORD(minorVer,majorVer);
    10         if(::WSAStartup(sockVersion,&wsaData)!=0)
    11         {
    12             exit(0);
    13         }
    14     }
    15     ~CInitSock()
    16     {
    17         ::WSACleanup();
    18     }
    19 };
    展开全文
  • Winsock

    千次阅读 2019-07-22 22:13:24
    WinSockWinsock初始化、反初始化错误检查和处理使用IP协议创建基本的Winsock调用来建立通信IPv4寻址字节排序创建套接字面向连接的通信在Winsock中,建立通信的步骤:服务器:客户机:套接字状态 Winsock 编译采用了...

    Winsock

    • 编译采用了WINSOCK.H的应用程序时,需要链接到WS2_32.LIB库
    • 使用WINSOCK.H时,需要链接到WSOCK32.LIB
    • 使用MSWSOCK.H时,需要链接到MSWCOCK.DLL
    初始化、反初始化

    1. 加载Winsock库
    示例:

    	WSADATA wsaData;
    	WSAStartup( MAKEWORD(2, 2), &wsaData);
    

    原型:

    int
    WSAAPI
    WSAStartup(
        __in WORD wVersionRequested,	//用于指定准备加载的Winsock库的版本,高位字节是次版本,低字节是主版本。通常使用MAKEWORD(x,y)来指定【x是高位字节,y是低位字节】
        __out LPWSADATA lpWSAData	//用与其加载的库版本有关的信息填充这个结构
        );
        
    //WSADATA
    typedef struct WSAData {
            WORD                    wVersion;	//设置为将要使用的Winsock版本
            WORD                    wHighVersion;	//包含了现有的Winsock库的最高版本
    #ifdef _WIN64
            unsigned short          iMaxSockets;
            unsigned short          iMaxUdpDg;
            char FAR *              lpVendorInfo;
            char                    szDescription[WSADESCRIPTION_LEN+1];
            char                    szSystemStatus[WSASYS_STATUS_LEN+1];
    #else
            char                    szDescription[WSADESCRIPTION_LEN+1];
            char                    szSystemStatus[WSASYS_STATUS_LEN+1];
            unsigned short          iMaxSockets;	//可以同时打开的最大套接字数量,不固定,尽量不要用这个值
            unsigned short          iMaxUdpDg;	//数据报的最大长度,不固定,尽量不要用这个值
            char FAR *              lpVendorInfo;
    #endif
    } WSADATA, FAR * LPWSADATA;
    

    在这里插入图片描述
    2. 释放
    使用后需要调用WSACleanup函数,来使Winsock释放所有由Winsock分配的资源,并取消这个应用程序挂起的Winsock调用。
    原型:
    int WSAAPI WSACleanup( void );

    错误检查和处理

    出现错误时(比如SOCKET_ERROR),可以调用WSAGetLastError函数来获得一段代码,这段代码专用来说明错误
    原型:

    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    int
    WSAAPI
    WSAGetLastError(
        void
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    
    • 如果想要手动设置WSAGetLastError获取的错误代码,可以调用WSASetLastError。
    • 注意:WSAStartup函数的调用不能使用WSAGetLastError来确定导致故障的特定错误(因为Winsock没有加载),用WSAStartup的返回状态判断(0是成功)

    使用IP协议创建基本的Winsock调用来建立通信

    • Winsock是一种独立于协议的接口
    • IP是一种无连接协议,它不能确保数据传输的成功
    • TCP和UDP通过IP进行面向连接和无连接的数据通信
    IPv4寻址

    程序通过sockaddr_in结构来指定IP地址和服务端口信息
    示例:

    	sockaddr_in sockAddr;
    	memset(&sockAddr, 0, sizeof(sockAddr));
    	sockAddr.sin_family = PF_INET;		//#define PF_INET         AF_INET,该字段设为AF_INET,以告知Winsock此时正在使用IP地址族。
    	sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sockAddr.sin_port = htons(1234);	//端口号在选择的时候,需要特别注意,某些端口是“已知的”服务保留的
    

    sockaddr_in结构:

    struct sockaddr_in {
            short   sin_family;		//协议族
            u_short sin_port;		//端口号
            struct  in_addr sin_addr;	//ip
            char    sin_zero[8];		//填充项,以使SOCKADDR_IN结构和SOCKADDR结构的长度一样
    };
    

    inet_addr函数可以将一个点分的IP转换成一个32位的无符号长整数。

    字节排序

    网络字节(network-byte)顺序:从最有意义到最无意义的字节排序(big-endian)
    将一个数从主机字节顺序转换成网络字节顺序API(具体用法用到的时候再补充吧):

    htol
    WSAHtol
    htons
    WSAHtons
    
    创建套接字
    SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);
    

    函数原型:

    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    __checkReturn
    SOCKET
    WSAAPI
    socket(
        __in int af,			//协议的地址族
        __in int type,		//协议的套接字类型。TCP/IP对应SOCK_STREAM;UDP/IP对应SOCK_DGRAM
        __in int protocol	//用于在给定地址族和套接字类型具有多重入口时,对具体的传送作限定。TCP--IPPROTO_TCP;UDP--IPPROTO_UDP
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    

    面向连接的通信

    • 在IP中,面向连接的通信是通过TCP/IP协议完成的。
    • TCP提供两个计算机间可靠无误的数据传输。
    在Winsock中,建立通信的步骤:
    服务器:

    1. 用Socket或WSASocker将给定的协议的套接字绑定到它已知的名称上

    bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    

    函数原型:

    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    int
    WSAAPI
    bind(
        __in SOCKET s,		//等待客户机连接的套接字
        __in_bcount(namelen) const struct sockaddr FAR * name,	//缓冲区,根据使用的协议,将实际地址填充到一个地址缓冲区,并在调用bind的时候将其转换为一个struct sockaddr
        __in int namelen	//要传递的、由协议决定的地址结构的长度
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    
    • 一旦出错,bind会返回SOCKET_ERROR。
    • 对于bind而言,最常见的错误是WSAEADDINUSE。
    • 如果使用的是TCP/IP,WSAEADDINUSE表示的是另一个进程已经同本地的IP接口及端口号绑定到了一起,或者那个IP和端口号处于TIME_WAIT状态。
    • 假如对一个已被绑定的套接字调用bind,返回的会是WSAEFAULT错误。

    2. 将套接字置为监听模式
    listen(servSock, 20);
    函数原型:

    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    int
    WSAAPI
    listen(
        __in SOCKET s,	//被绑定的套接字
        __in int backlog		//指定了被搁置的连接的最大队列长度。
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    
    • 因为在同一时间,可能会有多个服务器的连接请求,如果请求的数量过backlog,那么前面的backlog个请求被放在一个“挂起”队列中,以便应用程序(服务器)依次为他们提供服务。而backlog之后的连接请求都会失败,错误为WSAECONNREFUSED。
    • 一旦服务器接收了一个连接,那个连接请求就会从队列中删去,以便别人可以继续发出请求。
    • WSAEINVAL通常意味着,在调用listen之前没有调用bind。

    3. 若一台客户机试图创立连接,服务器必须通过accept或WSAAccept调用来接受连接

    	SOCKADDR clntAddr;
    	int nSize = sizeof(SOCKADDR);
    	SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
    

    函数原型:

    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    __checkReturn
    SOCKET		//返回值:一个新的套接字,用于已经被接受的那个客户机的连接。(后续的消息发送什么的应该用这个套接字)
    WSAAPI
    accept(
        __in SOCKET s,	//监听的套接字
        __out_bcount_opt(*addrlen) struct sockaddr FAR * addr,	//新连接的地址信息(输出)
        __inout_opt int FAR * addrlen	//连接结构体的大小
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    
    • 对于连接成功的客户机,在后续的操作中应该使用accept返回的新的套接字
    • 原本的监听套接字仍然用于接受其他客户机的连接,并且仍处于监听模式
    • WSAAccept可以根据指定条件接受一个连接
    客户机:

    客户机的创建步骤:

    1. 创建一个套接字
    2. 建立一个SOCKADDR地址结构,结构名称为准备连接到的服务器名。(对于TCP/IP,这是客户机应用程序锁监听的服务器的IP地址和端口号)
    3. 用connect或WSAConnect初始化客户机与服务器的连接
    套接字状态

    连接:

    • 对于每个套接字来说,它的初始状态都是CLOSED。
    • 若客户机初始化了一个连接,就会向服务器发送一个SYN包,同时将客户机套接字的状态置为SYN_SENT。
    • 服务器收到SYN包后,会发出一个SYN-ACK包,客户机需要用一个ACK包对它做出响应。此时,客户机的套接字将处于ESTABLISHED状态。
    • 如果服务器一直不发送SYN-ACK包,客户机就会超时,并返回CLOSED状态。
    • 服务器的套接字同本地接口及端口绑定起来,并在它上面进行监听,那么套接字的状态便是LISTEN。
    • 客户机试图与服务器连接时,服务器就会收到一个SYN包,并用一个SYN-ACK包作出回应。此时,服务器套接字的状态就编程SYN_RCVD。
    • 最后,客户机发出一个ACK包,它将使服务器套接字的状态变成ESTABLISHED。

    关闭连接:
    一旦应用程序处于ESTABLISHED状态,就可以通过两种方法来关闭它。
    主动关闭:

    • 应用程序会发出一个FIN包(应用程序调用closesocket或shutdown),并且套接字编程FIN_WAIT_1。
    • 通信的对方会用一个ACK包作为回应,套接字的状态随之编程FIN_WAIT_2
    展开全文
  • WINSOCK

    2007-11-19 10:27:15
    是做好的PPT.简单介绍下WINSOCK.
  • 测试WINSOCK控件是否有无问题。。。
  • WINSOCK控件

    2019-07-01 11:34:07
    WINSOCK控件的调用实例,方便没有使用过winsock控件的人学习,快速掌握TCP编程
  • 现象: 服务器无法上网,qq安全管家的网络修复卡在dns那里不动,看任务管理器dhcp服务占用很高 cmd ping同局域网地址可以ping通,ping外网不行 使用cmd 输入netsh winsock reset 显示找不到指定文件 解决办法: 怀疑...
  • WINSOCK.rar

    2021-04-09 10:19:29
    VB 通过WINSOCK 连接二维码识别器
  • vb winsock

    2014-07-18 13:58:37
    winsock控件说明,讲述winsock控件的使用注意事项
  • winsock2

    2012-12-26 18:22:03
    winsock2
  • 由于恶意软件、木马病毒攻击造成无法上网的问题,有可能是由于winsock配置错误造成的,这个小工具能够重置并修复Winsock配置到默认或者干净的状态。
  • WinSock Expert

    2018-09-01 16:37:18
    WinSock Expert 是一款由acai制作的抓包工具,WinSock Expert 可用来监视和修改网络发送和接收数据的程序,可以用来帮助您调试网络应用程序,分析网络程序的通信协议(如分析OICQ的发送接收数据),并且在必要的时候...
  • winsock编程

    2015-12-04 19:30:57
    利用winsock api 实现局域网聊天程序 可以看一下 能运行
  • 适用于误删winsockwinsock2注册表文件(win10家庭版)的童鞋 适用于误删winsockwinsock2注册表文件(win10家庭版)的童鞋 适用于误删winsockwinsock2注册表文件(win10家庭版)的童鞋
  • Win10家庭版 误删winsockwinsock2注册表的解决方案

    万次阅读 多人点赞 2017-04-02 16:20:36
    晚上不小心把winsockwinsock2注册表删除了,还没有做备份…简直是作死… 因为这2个注册表被删除,直接导致电脑无法上网,详细原因涉及到TCP/IP网络通信协议,这里不深入。 解决方案主要有2种,一种是手动安装...

    晚上不小心把winsock和winsock2注册表删除了,还没有做备份…简直是作死…
    因为这2个注册表被删除,直接导致电脑无法上网,详细原因涉及到TCP/IP网络通信协议,这里不深入。
    解决方案主要有2种,一种是手动安装TCP/IP协议;另一种就是直接从相同系统的其他电脑上导出一份winsock和winsock2注册表,然后在出问题的电脑上导入,win10家庭版应该只能用这种方式,或者用其他注册表修复软件。
    在第一种方法中,win10家庭版在安装TCP/IP协议时将会被组策略拦截下来,导致无法完成安装,而因为不存在本地组策略编辑器(win10 专业版有),而且这时电脑无法上网,无法进行升级。所以该方法将被锁死。
    因此用到了第二种方法,即导入其他正常电脑上的导出文件,这里提供下win10 家庭版的winsock和winsock2导出文件,方便遇到该问题的童鞋解决
    1.CSDN http://download.csdn.net/detail/yeyinglingfeng/9802170
    2.度盘 http://pan.baidu.com/s/1kUFemI7 (csdn自己给资源加下载分也是醉了,还不能改和删= =,用这个下吧,免费的)
    3.鉴于有童鞋出现解压错误的情况,再给一个解压完的下载地址
    百度云 :https://pan.baidu.com/s/18Jzge52vcRz-iuzNQ0xWVQ 提取码 ywq4
    github : https://github.com/SecondMagic/Team-Report-pic

    说下使用方法吧:
    1.下载上面给出的导出文件
    2.运行regedit,先右键开始,然后点击运行,按住win+R键也行
    右键开始,点击运行

    输入regedit

    3.找到winsock和winsock2,路径如下
    这里写图片描述

    4.删除winsock和winsock2这2个文件
    这里写图片描述

    5.导入下载的2个文件,记住2个都要导入一遍,然后重启电脑就行了,如果还是不行就在命令行(就是第2步改成输入cmd啦,后面步骤不用再做一遍)输入netsh winsock reset运行再重启即可
    这里写图片描述

    这次教训很惨重,你能想象到只有一台电脑,电脑上的itunes也刚被卸掉,手头只有一台iPhone和ipad,方圆几公里没熟人和网吧的痛苦吗?电脑无法上网导致无法下载导出文件,无法下载修复工具,iPhone和ipad下载了无法传给电脑(因为这2个注册表关系到网络协议,所以就算电脑链接到无线,也无法进行无线传输)。我都想买只android系统的手机了,手机里有导出文件却无法传给电脑,简直痛苦…
    劝告大家在对注册表进行编辑的时候一定要做备份。

    展开全文
  • Winsock编程

    2013-07-05 17:59:42
    Winsock编程基于VC6.0
  • WinSock1.1和WinSock2.0

    2018-06-28 11:51:00
     Windows提供了Windows Socket API(简称WSA),WinSock,目前有两个版本:WinSock1.1 and WinSock2.0  WinSock1.1 and WinSock2.0两个版本向后兼容:源码和二进制代码。WinSock2.0是对WinSock1.1的扩展(增加了很...

      网络编程很重要,说到网络编程就不得不提Socket编程。

      Windows提供了Windows Socket API(简称WSA),WinSock,目前有两个版本:WinSock1.1 and WinSock2.0

      WinSock1.1 and WinSock2.0两个版本向后兼容:源码和二进制代码。WinSock2.0是对WinSock1.1的扩展(增加了很多异步函数),这些扩展是针对Windows编程的。比如WSASelect可以用事件通知进行异步IO,而WinSock1.1由UNIX BSD socket移植过来的。

      程序员要做的只是包含新的头文件winsock2.h和简单得ws2_32.lib地链接。具体如下:

      WinSock1.1:
      #include <winsock.h> 
      #pragma comment(lib, "wsock32.lib")

      WinSock2.0:
      #include <winsock2.h>
      #pragma comment(lib, "ws2_32.lib")
      
      

     

     
    展开全文
  • Winsock.reg

    2019-12-13 15:18:31
    网络无法访问包Winsock2.2错误的注册表导入配置,导入注册表后就可修复,本文件为win10 专业版注册表信息,实际验证可修复win10 家庭版

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,238
精华内容 20,495
关键字:

WinSock