这样的:
新学VC++.NET2008,发现WINDOWS.H里面包含了Winsock.h,然后又查看了WINSOCK.H和WINSOCK2.H产生了很多疑问:1、我创建MFC静态DLL,工程里没发现WINDOWS.H被包含进来啊,难道自动的?2、如果是自动的,那我在使用RECV的时候,调用的是WSOCK32.DLL里的函数了?也就是说,想调用WS2_32.DLL中的RECV的话,必须包含WINSOCK2.H到工程?可如果包含了,不会产生冲突吗,系统知道我用的是哪个RECV啊?3、在WINSOCK.H中RECV是这样的:
int PASCAL FAR recv (
                     IN SOCKET s,
    __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf,
                     IN int len,
                     IN int flags);
而在WINSOCK2.H中RECV是这样的:
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
int
WSAAPI
recv(
    IN SOCKET s,
    __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf,
    IN int len,
    IN int flags
    );
#endif /* INCL_WINSOCK_API_PROTOTYPES */
有什么差异呢?4、如果我想在工程中同时使用WSOCK32.DLL中的函数和WS2_32.DLL里面的函数,应该怎么声明他们呢,又该如何调用呢?先100分吧,不好分配的时候再加!

解决方案 »

  1.   

    1、windows.h应该是只有windows窗口程序才会用到,如果不需要是可以不抱进来的
    2、winsock.h和winsock2.h是版本不同,具体我也忘记了,可以在网上查下.winsock2.h好像是windows自己出的
      

  2.   

    windows.h被包含进来了,位置是:
    afxwin.h包含afx.h
    afx.h包含afxver_.h
    afxver_.h包含afxv_w32.h
    afxv_w32.h包含windows.h
    但包含windows.h的时候没有包含winsock.h// Don't include winsock.h
    #pragma push_macro("_WINSOCKAPI_")
    #ifndef _WINSOCKAPI_
    #define _WINSOCKAPI_
    #endif#include <windows.h>#pragma pop_macro("_WINSOCKAPI_")
    所以你要使用winsock2的函数就很简单了
    #include <winsock2.h>
    #pragma comment(lib, "Ws2_32.lib")
      

  3.   

    这个……太狠了!
    回家之后一定要瞅瞅!
    产生一个疑惑,那我在输入RECV(的时候,就出现提示了,那个代码提示是哪来的?如果没导入WINSOCK.H的话,IDE咋知道我调用了RECV是WINAPI?还有就是我这时调用的RECV是哪个?WS2_32.DLL还是WSOCK32.DLL?#include <winsock2.h>
    #pragma comment(lib, "Ws2_32.lib") 这个……链接到WS2_32.lib就是说我这样就用的是WS2_32.DLL了吧于是#include <winsock.h> 
    #pragma comment(lib, "WSOCK32.lib") 就可以用WSOCK32.DLL了?那我要是鱼和熊掌兼得咋办呀……难不成这样:#include <winsock2.h>
    #pragma comment(lib, "Ws2_32.lib") 
    #include <winsock.h> 
    #pragma comment(lib, "WSOCK32.lib") 那我咋指定用哪个库里面的函数啊,不会产生N多冲突吧…………
      

  4.   

    很少会混合使用winsock2和winsock的,里面的函数实际上在两个文件中是各有一份的
      

  5.   

    winsock2是winsock的升级版本,直接用新版本就可以了,
      

  6.   

    该结贴了,不然会挂住……
    我还是无法在.NET 2008里使用WINSOCK.H,哎哎哎!即使包含了它,查看RECV什么什么的声明的时候还是在WINSOCK2.H里面,真烦人。
      

  7.   

    我记得winsock是1.1版本,winsock2是2.0版本
      

  8.   

    这样的:
    新学VC++.NET2008,发现WINDOWS.H里面包含了Winsock.h,然后又查看了WINSOCK.H和WINSOCK2.H产生了很多疑问:1、我创建MFC静态DLL,工程里没发现WINDOWS.H被包含进来啊,难道自动的?
    stdafx.h里包含了各种头文件,当然包括winodws.h。2、如果是自动的,那我在使用RECV的时候,调用的是WSOCK32.DLL里的函数了?也就是说,想调用WS2_32.DLL中的RECV的话,必须包含WINSOCK2.H到工程?可如果包含了,不会产生冲突吗,系统知道我用的是哪个RECV啊?
    你要指定链接库嘛!3、在WINSOCK.H中RECV是这样的:
    int PASCAL FAR recv (
                        IN SOCKET s,
        __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf,
                        IN int len,
                        IN int flags);
    而在WINSOCK2.H中RECV是这样的:
    #if INCL_WINSOCK_API_PROTOTYPES
    WINSOCK_API_LINKAGE
    int
    WSAAPI
    recv(
        IN SOCKET s,
        __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf,
        IN int len,
        IN int flags
        );
    #endif /* INCL_WINSOCK_API_PROTOTYPES */
    有什么差异呢?
    看MSDN的说明吧4、如果我想在工程中同时使用WSOCK32.DLL中的函数和WS2_32.DLL里面的函数,应该怎么声明他们呢,又该如何调用呢?
    包括它们的头文件,并且链接到这些库。先100分吧,不好分配的时候再加!
      

  9.   

    晕,我今天早上也遇到了这个问题,我的环境也是vs2008,我创建的是win32程序,而且是empty的,我写了一个socket的小程序,加了WinSock2.h就有冲突,什么头文件都不加,顺利编译通过...貌似自动包含了winsock.h
      

  10.   

    这个很强大啊,可很没看明白啊。。我试过单独包含WINSOCK.H,并且连接WSOCK32.LIB,但是我看RECV声明还是在WINSOCK2.H里面…………费劲
      

  11.   

    winsock2是winsock的升级版本,所以只要包含winsock2则两者都可以调用。
      

  12.   

    winsock2是winsock的升级版本,直接用新版本就可以了,
      

  13.   

    败了,准备结贴了,大家别着急拿分哈,呵呵呵呵呵呵呵,改天有时间的
    一看这信息,咱就不是不接贴的人:
    zcsor 
    等级: 
    可用分等级:中农 
    总技术分:6887 
    总技术分排名:3170 
    结帖率:101.56% 啥么叫牛啊!哈哈哈
      

  14.   

    安装 VC 后打开 windows.h 头文件,找到其中所有 winsock.h 全部替换成 winsock2.h,一劳永逸.
      

  15.   


    windows.h有包含winsock.h#if(_WIN32_WINNT >= 0x0400)
    #include <winsock2.h>
    #include <mswsock.h>
    #else
    #include <winsock.h>
    #endif /* _WIN32_WINNT >=  0x0400 */