关于创建socket时参数的讨论,一定是: 流式-TCP,数据报-UDP ?
例如:SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
第2个参数如果选流式套接字SOCK_STREAM,则第3个参数是否必须是IPPROTO_TCP;
若第2个参数选了数据报套接字SOCK_DGRAM,则第3个参数是否必须是IPPROTO_UDP ?
即流式套接字一定使用TCP协议,数据报套接字一定使用UDP协议??
当然,第3个参数也可以用0,让系统自己选择
问题是,要是我使用了流式套接字,但是用的是UDP协议,或者使用数据报套接字,但是用TCP协议,会有什么问题?
當然不是一定的,看看下面的定議:
/*
* 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 error 10043:
WSAEPROTONOSUPPORT
Protocol not supported. The requested protocol has not been configured into the system, or no implementation for it exists. For example, a socket call requests a SOCK_DGRAM socket, but specifies a stream protocol.