我下载了一个用socket的例子,运行正常。
但我在自己的程序中使用下面的语句,总是出错。 rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (rawSocket == SOCKET_ERROR) 
{ nErr = WSAGetLastError();
str.Format("%d",nErr);
WSAError("socket()");
return;
}
两个程序中此段代码完全相同,为什么socket的返回值一个正常,一个是10093,
我查了一下是什么WSAStartup 未运行,请问在调用这个函数之前还有什么操作吗,
还有什么需要引用的吗,还是有什么设置呀。
谢谢.

解决方案 »

  1.   

    当然要加载SOCKET库了
    DWORD Ret;  
    WSADATA wsadata;  
    if (Ret = WSAStartup(0x2020,&wsadata) != 0)
      {
        printf("WSAStartup failed with error %d\n",Ret);
        return 0;
      }还有,不要忘了 WS2_32.lib
      

  2.   

    谢谢,你说的是
    #include <afxsock.h> // MFC socket extensions
    吧,我已经加上了,不然无法编译呀,你说的WS2_32.lib在哪里加呀,我下载的例子程序怎么没看到它用呀,还能正常运行,
      

  3.   

    #include <iostream>
    #include <Winsock2.h>
    using namespace std;#pragma comment(lib, "Ws2_32.lib")  //首先你应当引用该库int main(void)
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
     
    wVersionRequested = MAKEWORD( 2, 2 );
     
    err = WSAStartup( wVersionRequested, &wsaData ); //然后初始化
    if ( err != 0 ) {                                 
        cout << "WSAStartup Error" << endl;
        return 0;
    }
     
                                        
    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 ) {                               
        cout << "wsaData.wVersion != 2 || wsaData.wVersion != 2" << endl;
        WSACleanup();
        return 0; 
    }

    SOCKET rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR) 
    {
    cout << "Error Socket" << endl;
    }
    else
    {
    closesocket(rawSocket);
    }

    WSACleanup();
    }