MFC之socket创建失败

原创 2012年03月06日 16:03:57

今天看了socket编程,写了段代码,模拟的ping命令,但是过程很曲折。


先写下socket的原型:

SOCKET socket
{
int af,
int type,
protocol
};

如果成功,则返回套接字句柄。

其中af指定协议簇,通常为AF_INET即IPV4协议。

type指定套接字类型,有3种可选值:

SOCK_STREAM:字节流套接字,提供有序的、可靠的、双向的且基于连接的字节流,使用TCP协议的时候使用。

SOCK_DGRAM:数据报套接字,提供无连接、不可靠的数据报传输服务,使用UDP协议的时候使用。

SOCK_RAW:原始套接字。

参数protocol指定协议类型,在winsock2.h

/*
 * Protocols
 */
#define IPPROTO_IP              0               /* dummy for IP */
#define IPPROTO_ICMP            1               /* control message protocol */
#define IPPROTO_IGMP            2               /* internet group management protocol */
#define IPPROTO_GGP             3               /* gateway^2 (deprecated) */
#define IPPROTO_TCP             6               /* tcp */
#define IPPROTO_PUP             12              /* pup */
#define IPPROTO_UDP             17              /* user datagram protocol */
#define IPPROTO_IDP             22              /* xns idp */
#define IPPROTO_ND              77              /* UNOFFICIAL net disk proto */

#define IPPROTO_RAW             255             /* raw IP packet */
#define IPPROTO_MAX             256


了解了socket ,就开始敲代码了。

通常情况,ping通过发送ICMP回显请求,来确定一个主机是否存在。如果能够成功到达,就说明目的主机存在。然后现在很多带有防火墙的操作系统都可以关闭相应ICMP回显请求,此时无法判定目的主机是否存在。ping程序的实现步骤比较简单,主要分为3步:创建ICMP封包、向目的主机发送ICMP请求,接收ICMP响应。


详细的代码就不粘贴出来了,主要看遇到的错误。创建socket 的代码如下:

	WORD wVersionRequested = MAKEWORD(2, 2);
	WSADATA wsaData;
	if(WSAStartup(wVersionRequested, &wsaData) != 0)
	{
		return FALSE;
	}

	SOCKET RawSock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
	if(RawSock == INVALID_SOCKET)
	{
		printf("Create socket error!\n");

		int nCodeError = ::GetLastError();
		printf("%d\n", nCodeError);
		return FALSE;
	}

编译运行时,总是提示创建失败,错误代码是10013。

上网查阅资料,大多都是说没有初始化什么的,跟我的问题不一样。


我使用了cmd查看错误信息帮助(net helpmsg 10013),信息显示:

以一种访问权限不允许的方式做了一个访问套接字的尝试。

以前没遇到过这类错误,很是疑惑了。仔细分析了这个提示后,发现主要就是权限不够,而我的电脑就我一个管理员用户,权限应该是够了的。那么是不是VS2008的权限不够呢。


所以我大胆尝试了下,把VS2008关闭了,然后使用管理员权限重现打开,编译运行,socket就创建成功了。果然问题出在这里。


原来win7对于原始套接字这类系统调用进行了系统权限的限制,要成功创建原始套接字就必须使用管理员权限运行VS2008。


问题解决,记述下来供以后参考。

关于创建socket失败的问题

昨天在调试程序的时候发现每次调用socket函数总是失败,可令人奇怪的是这个模块之前运行一直是OK!拿到的错误码是10106,宏是WSAEPROVIDERNOTINIT,意思大概是“请求的服务没有被加...
  • wjtxt
  • wjtxt
  • 2009年01月09日 10:15
  • 8775

关于Socket创建失败,10093

问题:创建套接字时发现10093错误。 问题描述:Failed to create UDP socket:10093!Close and restart app. 解决方案:在InitInstan...
  • q472599451
  • q472599451
  • 2012年05月23日 08:42
  • 14638

android 创建socket失败

最近在研究写一个棋牌客户端对接网狐的服务器,进展还比较顺利,客户端使用cocos2dx引擎,把我自己的网络库和网狐的数据封装机制对接工作已经做完,登陆、注册服务器,以及房间信息读取这些都已经完成,目前...
  • ycg514230
  • ycg514230
  • 2014年03月12日 14:36
  • 2953

android 创建socket失败

manifest.xml中注册android.permission.INTERNET权限   注:在application标签外注册即可;...
  • huang9012
  • huang9012
  • 2014年01月13日 22:06
  • 765

MFC中创建目录的相关问题

在编写录音机小程序的时候,碰到了一个创建文件目录的问题。针对在MFC中创建目录做一个小结。先以这个录音程序的实现为例说明。 在录音结束后要保存生成的声音文件,我想将每一次录音生成的声音文件都存储到系统...
  • shufac
  • shufac
  • 2014年03月04日 19:51
  • 1021

多文档程序框架中建立新的子框架类后出现“创建空文档失败”的问题

起因:多文档程序为了使用两个文档模板,其用来实时测量;其二用于数据处理显示。两个模板分别对应不同的子框架类:CChildFrame和CDispChildFrame。            已有的CCh...
  • ww285705191
  • ww285705191
  • 2014年03月12日 17:41
  • 763

解决ftp客户端 建立数据socket 失败问题

前面提到了怎么用linux ftp客户端连接serv-u。 现在碰到了新的问题,用cute ftp 5.0连接失败,提示”建立数据socket失败“。要解决这个问题,参考了这篇:http://w...
  • bianjing40
  • bianjing40
  • 2015年09月01日 10:31
  • 3217

android程序建立socket失败

socket = new Socket("192.168.1.100", 9999); 用上面代码建立and
  • cydenghua
  • cydenghua
  • 2014年04月30日 20:54
  • 1057

MFC用CreateDirectory创建文件目录

原文链接:http://blog.csdn.net/eickandy/article/details/47775863 CreateDirectory这个函数的作用是创建一个新的目录...
  • u012987386
  • u012987386
  • 2017年05月02日 18:11
  • 195

MFC 程序隐藏界面

最近在整合相机和数据发送程序, 由于两个程序都用到了socket编程, 考虑到之前一次整合相机和蓝牙程序的时候, 两个socket只能有一个工作的情况(至于为什么会是这种情况, 到现在还是没有能够弄明...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年02月26日 21:06
  • 1429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC之socket创建失败
举报原因:
原因补充:

(最多只允许输入30个字)