如果成功,则返回套接字句柄。
其中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编程,写了段代码,模拟的ping命令,但是过程很曲折。先写下socket的原型:SOCKET socket{int af,int type,protocol};如果成功,则返回套接字句柄。其中af指定协议簇,通常为AF_INET即IPV4协议。type指定套接字类型,有3种可选值:SOCK_STREAM:字节流套接字,提供有序的
Socket error 0 – Directly send error
Socket error 10004 – Interrupted function //call 操作被终止
Socket error 10013 – Permission denied //c访问被拒绝
Socket error...
1.TCP_NODELAY 和 NAGLE 算法
当我们通过 TCP socket 分多次发送较少的数据时,比如小于 1460 或者 100 以内,对端可能会很长时间收不到数据,导致本端应用程序认为超时报错。这时可能是受到了 TCP NAGLE 算法的影响。
2.NAGLE算法了解
TCP NAGLE算法和实现
网络编程中Nagle算法和Delayed ACK...
笔记本重装系统后,以前能运行的程序中的Ping程序不能运行了。查看代码,创建套接字失败。
RawSock = socket ( AF_INET, SOCK_RAW, IPPROTO_ICMP ) ;
RawSock==INVALID_SOCKET
用DWORD dwError=WSAGetLastError();查看错误代码为10013.
网上查了一下,说是权限被拒绝。以一