我下载了一个用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 未运行,请问在调用这个函数之前还有什么操作吗,
还有什么需要引用的吗,还是有什么设置呀。
谢谢.
但我在自己的程序中使用下面的语句,总是出错。 rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (rawSocket == SOCKET_ERROR)
{ nErr = WSAGetLastError();
str.Format("%d",nErr);
WSAError("socket()");
return;
}
两个程序中此段代码完全相同,为什么socket的返回值一个正常,一个是10093,
我查了一下是什么WSAStartup 未运行,请问在调用这个函数之前还有什么操作吗,
还有什么需要引用的吗,还是有什么设置呀。
谢谢.
DWORD Ret;
WSADATA wsadata;
if (Ret = WSAStartup(0x2020,&wsadata) != 0)
{
printf("WSAStartup failed with error %d\n",Ret);
return 0;
}还有,不要忘了 WS2_32.lib
#include <afxsock.h> // MFC socket extensions
吧,我已经加上了,不然无法编译呀,你说的WS2_32.lib在哪里加呀,我下载的例子程序怎么没看到它用呀,还能正常运行,
#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();
}