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 <WinSock2.h>
#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;
} S_un; } 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* cp);

 

用于将字符串形式的点分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, //可以是这个SOL_SOCKET.
  _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类似.只是将值写进去