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

    2011-08-12 12:30:43
    #include <ws2tcpip.h>  setsockopt(sockRaw,IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)); 这个方法在操作系统windows xp sp3可以设置 ip ttl (time to live)。 在windows7 home basic 也可以对 ...

     

    #include <ws2tcpip.h>

     setsockopt(sockRaw,IPPROTO_IP,   IP_TTL,   (char   *)&ttl,   sizeof(ttl));

    这个方法在操作系统windows xp sp3可以设置 ip ttl (time to live)。

    在windows7 home basic 也可以对 ip的 ttl (time to live)设置成功、注意包括windows.h此方法将会失败,原因还未找到。

    展开全文
  • winSocket2提交网页数据
  • 如何解决windows.h和WinSocket2.h的冲突 在一个大的VC++工程里,经常会遇到这样一个问题,比如想要使用一个库,而这个库里要使用<Windows.h>头文件,但是这样会引起后面代码里使用WinSocket2.h的冲突,导致...

    如何解决windows.h和WinSocket2.h的冲突

    在一个大的VC++工程里,经常会遇到这样一个问题,比如想要使用一个库,而这个库里要使用<Windows.h>头文件,但是这样会引起后面代码里使用WinSocket2.h的冲突,导致整个工程编译不过。为了解决这个问题,可以把WinSocket2.h提前,包含到<Windows.h>之前,如下所示:

    #include <WinSocket2.h>
    #include <Windows.h>
    
    typedef struct
    {
        CRITICAL_SECTION cs;
        char is_valid;
    } mbedtls_threading_mutex_t;

    这样就会先包含WinSocket2.h文件,这样就不会导致冲突了。其实,VC里还提供了另外一个宏定义WIN32_LEAN_AND_MEAN,定义了这个宏就可以减少编译时包含的头文件,并且提高编译速度。由于定义这个宏,导致WinSocket2.h文件定义的宏就不有先定义了,它作用这样的:

    #ifndef WIN32_LEAN_AND_MEAN
        #include <cderr.h>
        #include <dde.h>
        #include <ddeml.h>
        #include <dlgs.h>
        #ifndef _MAC
            #include <lzexpand.h>
            #include <mmsystem.h>
            #include <nb30.h>
            #include <rpc.h>
        #endif
        #include <shellapi.h>
        #ifndef _MAC
            #include <winperf.h>
            #include <winsock.h>
        #endif
        #ifndef NOCRYPT
            #include <wincrypt.h>
            #include <winefs.h>
            #include <winscard.h>
        #endif
    
        #ifndef NOGDI
            #ifndef _MAC
                #include <winspool.h>
                #ifdef INC_OLE1
                    #include <ole.h>
                #else
                    #include <ole2.h>
                #endif /* !INC_OLE1 */
            #endif /* !MAC */
            #include <commdlg.h>
        #endif /* !NOGDI */
    #endif /* WIN32_LEAN_AND_MEAN */

    从这里可以看到,它是怎么样减少头文件包含,以及不引起冲突的,所以冲突的头文件顺序可以写成这样:

    #define WIN32_LEAN_AND_MEAN
    #include <Windows.h>
    
    typedef struct
    {
        CRITICAL_SECTION cs;
        char is_valid;
    } mbedtls_threading_mutex_t;

    到这里,就可以完善地解决了这个问题。

    C++标准模板库从入门到精通 
    http://edu.csdn.net/course/detail/3324

     

    展开全文
  • 使用winsocket2,包括各种代理,连接方式,包的加密解密等模块!
  • 客户端卸载后上不网的解决方法,winsock和winsock2注册表,用于重新修复10的注册表
  • 如何解决windows.h和WinSocket2.h的冲突 最近在学习c++网络编程,刚一 开始就遇到了一个问题,就是引入windows.h和WinSocket2.h头文件之后生成失败,警告信息是下面这样的。 意思就是说发生了很多宏定义冲突,...

    如何解决windows.h和WinSocket2.h的冲突

    最近在学习c++网络编程,刚一 开始就遇到了一个问题,就是引入windows.h和WinSocket2.h头文件之后生成失败,警告信息是下面这样的。

    意思就是说发生了很多宏定义冲突,而且这些宏定义都是接下来的socket编程需要用到的。

    在网上查了很多资料,简单来说呢,原因就是windows.h头文件中已经包含了很多关于socket的宏定义,但是当我们引入winsocket2.h头文件的时候呢,这些宏定义已经跟之前的不一样了,也就产生了冲突。

    不管原因如何,咱们最关心的是解决方法。

    下面来介绍一下两种解决方法。

    解决方法

    第一种呢,很简单将winsocket2头文件的引入放在windows头文件之前。

    这样呢,就可以解决之前的冲突问题了。

    但是,如果我们的项目工程很大的话,不能确保这两个头文件的引入顺序一定是正确的,检查起来也比较麻烦。

    所以我还是比较推荐使用下面的第二种方法来解决。

     就是加入下面的宏

    这个宏是用来干嘛的呢,其实它是用来减少我们不常用到的宏定义,来起到提高编译速度的。

    不过这个方法呢,也是官方提供给我们用来解决这个冲突的一个方法。

    展开全文
  • winsocket2.pas

    2011-07-16 18:52:42
    windows socket2的delphi函数声明文件。
  • 源码包括两部分: 1、SocketTest为用完成断开+重叠IO技术实现的服务端,创建一个线程统一处理多个...2、Client为客户端,用于单线程连线+事件选择模式接收服务器信息,或者多线程(一个线程一个客户端连线)压力测试。
  • QT入门学习——WinSocket2

    千次阅读 2018-03-14 11:14:07
    WSAStartup(MAKEWORD(2,2), &wsaData);     //  创建一个新的 Socket 来响应客户端的连接请求     sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);       //  填写服务器绑定的地址信息   //  ...
    网络编程是个很大的课题,这里只限Windows Socket编程。转一篇别人的文章,仅供参考。


    一,什么是Socket

    接触网络编程当然要了解SocketSocket(套接字)是一种网络编程接口,Socket提供了很多灵活的函数,帮助程序员写出高效的网络应用。Socket分为BSD UNIXwindows两个版本。

    win32平台上的Winsock编程都要经过下列基本步骤:

    定义变量——获得Winsock版本——加载Winsock——初始化——创建套接字——设置套接字——关闭套接字——卸载Winsock

    使用winsock2 API编程,必须包含头文件winsock2.h (链接环境WS2_32.LIB),头文件winsock.hWSOCK32.LIB)是为了兼容winsock1程序时使用的,另外mswsock.hMSWSOCK.DLL)是微软的扩展类,用于开发高性能的winsock程序。

    准备好后,你就可以着手建立你的第一个网络程序了。

    二, Socket编程的基本过程

    Socket通信分为面向连接的通信(TCP)和面向无连接的通信(UDP).

                 

    1Winsock初始化和结束

    每一个winsock应用程序必须首先加载相应的winsock dll版本。方法是调用:

    int WSAStartup(

        WORD wVersionRequested,     库版本,高字节副版本,低字节主版本

        LPWSADATA lpWSAData         结构指针,函数自动填充该结构。

    );    函数调用成功返回0

    可以用宏MAKEWORD(x, y)用来指定第一个参数的值

     

    2,建立套接字

    套接字是传输提供者的一个句柄。

    SOCKET socket (

        int af,          

        int type,        

        int protocol      IPPROTO_TCP, IPPROTO_UDP 0(如果不想指定)

    );

    第一个参数指定通信协议的协议族,AF_INET(IPv4) AF_INET6(IPv6)(因为Socket是网络编程接口而不是一个协议,它使用流行的网络协议(TCP/IPIPX)为应用程序提供的一个编程接口。)

    第二个参数指定要创建的套接字的类型。SOCK_STREAM(TCP流套接字), SOCK_ DGRAM(UDP数据包套接字)SOCK_RAW(原始套接字)

    第三个参数指定应用程序所指定应用程序所使用的通信协议。

    函数成功返回套接字描述符,失败返回INVALID_SOCKET

     

    3,配置套接字

    当创建一个套接字后,再进行网络通信之前,必须先配置Socket。面向连接的客户端Socket通过调用connect函数在Socket数据结构中保存地址和远端信息。无连接客户端,服务端以及面向连接Socket的服务端,通过调用bind函数来配置本地信息。

    int bind(

        SOCKET                     s,                创建的套接字

        const struct sockaddr FAR* name,       指向地址缓冲区的指针

        int                        namelen     地址缓冲区的大小

    );

    成功返回0失败返回SOCKET_ERROR

    当创建一个套接字后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。

    第二个参数指定一个sockaddr结构定义如下:

    struct sockaddr {

            u_short    sa_family;

            char       sa_data[14];

    };

    我们通常使用另外一个等价的地址结构:

    de>struct sockaddr_in {de>
    de>        short   sin_family;de>
    de>        u_short sin_port;de>
    de>        struct  in_addr sin_addr;de>
    de>        char    sin_zero[8];de>
    de>};de>
    de>其中sin_family是通信协议族,de>
    de>sin_portde>de>指明端口号,de>
    de>sin_addrde>de>结构中有一个字段s_addr,表示IP地址,该字段是一个整数,de>
    de>一般用函数inet_addr把点分字符串形式的IP地址转化成unsigned long型的整数值。de>
    de>de>de>如果指定为htonl(INADDR_ANY),那么无论哪个网段上的客户机都能与该服务器通信,de>
    de>否则,只有与指定IP地址处于同一网段上的客户机能与该服务器通信。de>
    de>sin_zero[8]de>de>为填充,使两个结构大小相同。de>
    de> de>

    de>有一些细节学要说明:de>   在计算机把IP地址和端口号指定成多字节时,这个数是按“主机字节”(host-byte)顺序表示的,不同的处理器对数的表示方法有“大头”(big-endian——最有意义的字节到最无意义的字节)和“小头”(little-endian)两种形式。但是如果在网络上指定IP地址和端口号时,必须按照big-endian 的形式,一般称之为“网络字节”(network-byte)顺序。

    以下几个函数将主机字节顺序转换成网络字节顺序:

    u_long htonl(u_long hostlong);

     

    int WSAHtonl(

        SOCKET s,

        u_long hostlong,

        u_long FAR * lpnetlong               通过指针返回网络字节顺序的4个字节的数

    );

     

    u_short htons(u_short hostshort);

     

    int WSAHtons(

        SOCKET s,

        u_short hostshort,

        u_short FAR * lpnetshort        通过指针返回网络字节顺序的2个字节的数

    );

    以下几个函数将网络字节顺序转换成主机字节顺序:

    u_long ntohl(u_long netlong);

     

    int WSANtohl(

        SOCKET s,

        u_long netlong,

        u_long FAR * lphostlong

    );

     

    u_short ntohs(u_short netshort);

     

    int WSANtohs(

        SOCKET s,

        u_short netshort,

        u_short FAR * lphostshort

    );

    de> de>
    de>

    4,实现功能

    (1)       服务器端需要对绑定的端口进行侦听,函数原型如下

           de>int listen (de>
    de>  SOCKETde>de> sde>de>,    de>de>de>
    de>  intde>de> backlog  de>de>de>
    de>);de>de>de>

        de>Backlogde>de>是客户连接请求队列的最大数量,而不是客户机连接的数量限制。de>

    de>处于侦听的套接字将维护一个客户连接请求队列。de>

    de>    de>de>该函数执行成功返回0,失败返回de>SOCKET_ERROR

        此外,需要从连接请求队列中取出最前面的一个客户请求,需要用到accept()函数:

             de>SOCKET accept (de>
    de>  SOCKETde>de> sde>de>,                   de>de>de>
    de>  struct sockaddr FAR*de>de> addrde>de>,  de>de>de>
    de>  int FAR*de>de> addrlen            de>de>de>
    de>);de>
    de>该函数创建一个新的套接字来与客户套接字建立通信,如果连接成功,就返回新建的套接字描述符,de>
    de>以后与客户通信的就是该套接字,而侦听套接字则继续接受新的连接;如果失败就返回de>INVALID_SOCKET
    第一个参数是侦听套接字
    第二个套接字用来返回新创建的套接字的地址结构
    第三个套接字返回地址结构的长度
    de> de>

    (2)       客户端:

    connect函数是客户机建立与远程服务器连接而使用的。

    de>int connect (de>
    de>  SOCKETde>de> sde>de>,                          de>de>de>
    de>  const struct sockaddr FAR* de>de> namede>de>,  de>de>de>
    de>  intde>de> namelen                        de>de>de>
    de>);de>
    de> de>

    5,数据传输

           收发数据时网络编程的一切在这里我们只讨论同步函数sendrecv

    不讨论异步函数WSASendWSARecv

    数据发送要用到send函数,原型如下:

    int send(
        SOCKET s,
        const char FAR * buf,    发送数据缓冲区的地址
        int len,                  要发送的字节数
        int flags                 一般为0, MSG_DONTROUTE,MSG_OOB(外带数据)
    );
    成功返回发送字节数,出错返回SOCKET_ERROR
    注意send函数把数据从buf复制到socket发送缓冲区后就返回了,
    但是这些数据并不时马上就发送到连接的另一端。
     

    在已连接的套接字上接受数据,recv函数是最基本的方式。

    int recv(
        SOCKET s,
        char FAR* buf,
        int len,       准备接收的字节数或buf缓冲区长度
        int flags      0, MSG_PEEKMSG_OOB 其中MSG_PEEK表示将有用的数据复制到所提供的接
                  收端缓冲区,但是没有从系统缓冲区中将它删除
    );

    成功返回接收的数据的字节数量,失败返回SOCKET_ERROR,如果接受数据时网络中断返回0

     
     

    6,关闭Socket

    一旦完成任务,记得将套接字关闭以释放资源:
    int closeSocketSOCKET s

    三,       Socket编程实例

     
    讲了这么多其实还是看实例最为重要了,下面我提供了最简单的面向连接的客户端和服务端程序,
    当服务端接受客户端的连接后,先是该客户机地IP地址,并向客户端发送一个回应消息,
    最后关闭该连接套接字。这样的服务器当然没什么实际的用途。

    设计一个基本的网络服务器有以下几个步骤:

    1、初始化Windows Socket

    2、创建一个监听的Socket

    3、设置服务器地址信息,并将监听端口绑定到这个地址上

    4、开始监听

    5、接受客户端连接

    6、和客户端通信

    7、结束服务并清理Windows Socket和相关数据,或者返回第4

     

    #include <winsock2.h>

    #include <stdio.h>

     

    #define SERVPORT    5050

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

     

    void main(void)

    {

       WSADATA              wsaData;

       SOCKET               sListen;              // 监听socket

       SOCKET               sClient;        // 连接socket

       SOCKADDR_IN          serverAddr;              // 本机地址信息

       SOCKADDR_IN          clientAddr;        // 客户端地址信息

       int                        clientAddrLen;       // 地址结构的长度

       int                  nResult;

       // 初始化Windows Socket 2.2

     

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

      

       // 创建一个新的Socket来响应客户端的连接请求

     

       sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

            

       // 填写服务器绑定的地址信息

       // 端口为5150

       // IP地址为INADDR_ANY,响应每个网络接口的客户机活动

       // 注意使用htonlIP地址转换为网络格式

                 

       serverAddr.sin_family = AF_INET;

       serverAddr.sin_port = htons(SERVPORT);   

       serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

       memset(&(serverAddr.sin_zero), 0, sizeof(serverAddr.sin_zero));        

       // 绑定监听端口

            

       nResult = bind(sListen, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR));

       if (nResult == SOCKET_ERROR)

       {

                  printf("bind failed!\n");

     

                  return;

       }

     

       // 开始监听,指定最大接受队列长度5,不是连接数的上限

     

       listen(sListen, 5);

     

       // 接受新的连接

       while(1)

       {

                  clientAddrLen = sizeof (SOCKADDR);

                  sClient = accept(sListen, (SOCKADDR *)&clientAddr, &clientAddrLen);

                  if(sClient == INVALID_SOCKET)

                  {

                         printf("Accept failed!");

                  }

                  else

                  {

                         printf("Accepted client: %s : %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));

                         // 向客户端发送信息

                         nResult = send(sClient, "Connect success!", 16, 0);

                         if (nResult == SOCKET_ERROR)

                         {

                                printf("send failed!");

                         }

                  }

            // 我们直接关闭连接,

                  closesocket(sClient);

           } 

      

      

       // 并关闭监听Socket,然后退出应用程序

     

          closesocket(sListen);

     

       // 释放Windows Socket DLL的相关资源

     

          WSACleanup();

    }

     
    客户机程序如下:

    #include <winsock2.h>

    #include <stdio.h>

     

    #define SERVPORT    5050              // 端口为5150

    #define MAXDATASIZE 100

    #define SERVIP      "127.0.0.1"      // 服务器IP地址为"127.0.0.1",注意使用inet_addrIP地址转换为网络格式

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

     

    void main(int argc, char *argv[])

    {

       WSADATA              wsaData;

       SOCKET               sConnect;

       SOCKADDR_IN          serverAddr;      

       int                                 recvbytes;

       char                               buf[MAXDATASIZE];

     

       //初始化Windows Socket 2.2

     

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

      

       // 创建一个新的Socket来连接服务器

     

        sConnect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

      

       // 填写连接地址信息

     

        serverAddr.sin_family = AF_INET;

        serverAddr.sin_port = htons(SERVPORT);   

        serverAddr.sin_addr.s_addr = inet_addr(SERVIP);

     

           memset(&(serverAddr.sin_zero), 0, sizeof(serverAddr.sin_zero));

     

       // 向服务器发出连接请求

     

        if (connect(sConnect, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)

           {

                  printf("connect failed!\n");

     

                  return;

           }

           // 接受服务器的回应消息

        recvbytes = recv(sConnect, buf, MAXDATASIZE, 0);

           if (recvbytes == SOCKET_ERROR)

           {

                  printf("recv failed!\n");

           }

           else

           {

                  buf[recvbytes] = '\0';

                  printf("%s\n",buf);

           }

     

        closesocket(sConnect);

     

       // 释放Windows Socket DLL的相关资源

     

     

        WSACleanup();

    }

     

    四,结束语

    这里介绍的只不过是winsock最基础最基础的知识,开发网络程序从来都不是一件容易的事情,尽管只需要遵守很少的一些规则创建套接字,发起连接,接受连接,发送和接受数据。真正的困难在于:让你的程序可以适应从单单一个连接到几千个连接,即开发一个大容量,具可扩展性的Winsock应用程序。

    Winscok编程很重要的一部分是IO处理,分别提供了“套接字模式”和“套接字I/O模型”,可对一个套接字上的I/O行为进行控制。其中,套接字模式用于决定在随一个套接字调用时,那些Winsock函数的行为,有阻塞和非阻塞两种模式

    而另一方面,套接字模型描述了一个应用程序如何对套接字上进行的I/O进行管理及处理,包括包括SelectWSAAsyncSelectWSAEventSelect IO重叠模型,完成端口等。

    在这里推荐一本好书《windows网络编程技术》,有兴趣研究的同志可以去啃一啃

    展开全文
  • #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<iostream> #include<stdio.h> #include<Windows.h> #include<WinSock2.h> //#prag...
  • #define WIN32_LEAN_AND_MEAN //这句代码可以避免重复引用 #include<windows.h> #include <Winsock2.h>
  • 2:socket(AF_INET,//The Internet Protocol version 4 (IPv4) address family SOCK_STREAM,//, two-way,This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET...
  • WinSocket

    2019-04-05 12:03:02
    2、需要加载对应的库文件#pragma comment(lib, " ") 参考:C语言的Socket编程例子 一、TCP类型的socket的例子: #include <iostream> #include <WinSock2.h> using namespace std; #prag...
  • Winsocket

    2014-07-27 11:36:08
    1.选择winscok协议 2.在录制的OPTIONS里面设置
  • winsocket

    2013-07-15 19:32:49
    #include ...#pragma comment(lib ,"ws2_32") //接收缓冲区大小  #define RECV_BUFF_SIZE 1000  //发送缓冲区大小  #define SEND_BUFF_SIZE 1000  //IP字符串数组大小  #define IP_SIZE
  • winsocket入门教程

    2014-03-27 10:40:40
    资源包括两个文档 1 Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序 TCP doc 2 Winsocket入门教程二:非阻塞式服务器和客户端程序 TCP doc
  • //winsocket2头文件,用于使用winsock2网络库 #include #pragma comment(lib, "WS2_32") // 链接到WS2_32.lib class CInitSock { public: CInitSock(BYTE minorVer = 2, BYTE majorVer = 2) { // 初始化WS2_
  • WinSocket API

    千次阅读 2012-05-30 00:53:27
    WinSocket API —— TCP\IP连接 要进行网络通信编程,就要用到socket(套接字)。套接字代表一个通信端口,有地址,有端口号,可连接(按类型),可收,可发。 要进行socket编程,要为工程导入库文件,添加...
  • QT使用winsocket

    千次阅读 2017-01-21 13:56:53
    QT自带network模块提供网络功能,这里介绍QT下如何使用winsocket来开发网络程序。 在项目工程文件中配置 LIBS += -lws2_32 在源代码文件中添加头文件引用 #include 然后编写源代码 WSADATA...
  • Winsocket通信测试

    千次阅读 2015-03-30 18:08:04
    Winsocket通信初调试在学习网络编程之前,我们需要对Tcp/ip协议栈有个清楚地了解。Tcp/ip协议栈分以下五层,也有分成7层 5、应用层 4、传输层 3、网络层 2、数据链路层 1、物理层 物理层是实实在在的物理链路,...
  • Winsocket原理

    2008-02-22 10:24:00
    2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式: 首先服务器方要先启动,并根据请示提供相应服务:(过程如下) 1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收...
  • winSocket 简单实现

    2019-10-07 06:20:26
    #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<iostream> #include<stdio.h> #include<Windows.h> #include<WinSock2....
  • winsocket编程几种模式(2

    千次阅读 2014-03-27 10:29:04
    2、网络地址的数据结构,有一个老的和一个新的的,请大家留意,如果想知道为什么,请发邮件给BillGate。其实就是计算机的IP地址,不过一般不用用点分开的IP地 址,当然也提供一些转换函数。 ◆旧的网络地址...
  • winsocket那些问题

    2017-09-28 12:44:13
    问题1,如果没有连接上,connect会一直阻塞么?accept呢? 问题2,send和recv的超时时间,会一直阻塞么? 问题3,服务器一个监听socket建立多少个 连接?
  • winSocket数据传输

    2016-10-11 13:10:00
    服务器端: ...WINSOCK2.H> 2 #include <stdio.h> 3 #pragma comment(lib,"ws2_32.lib") 4 int main(int argc,char **argv) 5 { 6 //创建套接字 7 WORD myVersionRequest; 8 ...
  • winsocket笔记01

    2015-12-05 23:03:03
    FD_WRITE触发条件: 1.client 通过connect(WSAConnect)...2.server通过accept(WSAAccept)接受client连接请求时,在server端会触发FD_WRITE事件 3.send(WSASend)/sendto(WSASendTo)发送失败返回WSAEWOULDBLOCK

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

winsocket2