1.socket 开发接口位于应用层与传输层之间,可以选择TCP与UDP2中传输层协议进行开发
2.socket类型:
流式socket,SOCK_STREAM:提供面向连接的,可靠的传输服务,可以采用全双工方式.同时接收和发送数据. 如ftp协议就是基于流式的. 一般选择
tcp协议的话就是利用这种socket
数据包式socket SOCK_DGRAM:提供面向无连接
,不可靠传输服务,如dns协议, 一般选择udp协议就利用这种socket
原始SOCKET SOCK_RAW: 上面2种要么选择tcp,要么选择udp协议. 但使用原始socket就没有限制,可以在ip层上对socket进行编程.
发送和接收ip层上原始数据包.如icmp
3.winsock
winsock有2个版本:winsock1.1和winsock2.2
头文件,静态库包含,版本设置框架:
2.2:
#include#pragma comment(lib,"ws2_32.lib")void main(){ WSADATA wsaData;//该结构体需要初始化后才能进行后续的socket api. 包含系统socket支持的信息 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("error\n"); return; } //可以开始进行网络通信了 //最后的清理工作 if (WSACleanup()==SOCKET_ERROR) { printf("clean error\n"); return; }}
4.IP地址表示形式
网络字节序:低位存储数据的高位字,在网络中以便各种设备统一.
通过in_addr结构体保存网络字节序的ip
定义如下:
in_addr
The in_addr structure represents a host by its Internet address.
typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } ;} in_addr;
Members
- S_un
-
- S_un_b
- Address of the host formatted as four u_chars. S_un_w
- Address of the host formatted as two u_shorts. S_addr
- Address of the host formatted as a u_long.
2个重要函数:
The inet_addr function converts a string containing an (Ipv4) Internet Protocol dotted address into a proper address for the IN_ADDR structure.
unsigned long inet_addr( const char* );
用于将字符串形式的点分10进制的ip地址转为unsigned long类型的网络字节序ip,可以被in_addr 使用.错误的ip将返回INADDR_NONE
inet_ntoa()将in_addr 的网络字节序ip转为字符串的点分10进制ip
主机字节序ip格式
4个api:
u_long htonl(u_long hostlong), 将u_long 类型的主机字节序ip转为网络字节序ip
u_short htons(u_short hostshort),将u_short类型的主机字节序ip转为网络字节序ip
u_long ntoh1(u_long netlong)将u_long类型网络字节序转为主机字节序
u_short ntohs(u_short netshort)将u_short类型网络字节序转为主机字节序
socket选项:
int getsockopt( _In_ SOCKET s, _In_ int level, //可以是这个. _In_ int optname, //查询的选项 _Out_ char *optval, //查询返回的值 _Inout_ int *optlen //返回缓冲大小);
有这些选项:SO_ACCEPTCONN,SO_TYPE 等
int setsockopt( _In_ SOCKET s, _In_ int level, _In_ int optname, _In_ const char *optval, _In_ int optlen); 和getsockopt类似.只是将值写进去