网络编程学习心得

关于网络编程,第一个头痛的就是关于其各种不同的地址格式:


UNIX

struct in_addr{

    in_addr_t   s_addr;}; /*32为的地址结构,是网络字节序*/

struct sockaddr_in{

    uint8_t              sin_len;                

    sa_family_t     sin_family;                /*AF_INET   (套接字地址结构的地址族)*/

    in_port_t           sin_port;                    /*16bit的TCP或udp的端口号,是网络字节序*/

    struct in_addr  sin_addr;                  //32字节的ipv4地址,是网络字节序

    char                     sin_zero[8];         //保留

};


Window

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, *PIN_ADDR, FAR *LPIN_ADDR;
union的作用是将大括号里所有的东西的内存分配都放在一起。使用的时候只有一个能使用。可以使S_un.S_addr  S_un.S_ub_b  S_un.Sun_w

  我们可以用两种方式来引用一个ipv4的套接字地址结构,也叫网际套接字地址结构

假设  struct sockaddr_in  serv;

则   serv.sin_addr 和serv.sin_addr.sin_addr都可以引用到ip地址。只不过一个是引用in_addr是一个结构体,另一个in_addr_t是一个无符号的整数,这点要注意区分.

在实际使用的时候常常有两种模式  connect(sd, (const struct  sockaddr*)&addr, sizeof(addr));  和connect(sd, (LPSOCKADDR)&addr, sizeof(addr));

就目前的理解,他俩没有什么区别 就是说 const struct sockaddr*   和LPSOCKADDR  个人理解LP也可以理解成long pointer

下面说一下对主机字节序和网络字节序的理解,其实我们不需要知道他们怎么表示inet_addr(const char* strptr)  如servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

这个函数是将一个形如"127.0.0.1"字符串转化成一个网络字节序;

相反,也有着char FAR* inet_ntoa(struct in_addr in);可以将一个网络字节序转化成我们常见的字符串表示

也有着网络字节序和主机字节序转换的函数如 :  htonl()  htons()  ntohl()  ntohs()这几个其实很好记  h代表着host 主机  n代表net网络  l代表long 四个字节 s是short 两个字节 常用于端口的转换。

SOCKET WSASocket (
  int
af ,
  int
type ,
  int
protocol ,
  LPWSAPROTOCOL_INFO
lpProtocolInfo ,
  GROUP
g ,
  DWORD
dwFlags
   );
参数说明:
af:[in]一个地址族规范。目前仅支持AF_INET格式,亦即ARPA Internet地址格式。
type:新 套接口的类型描述。
protocol: 套接口使用的特定协议,如果调用者不愿指定协议则定为0。
lpProtocolInfo:一个指向PROTOCOL_INFO结构的指针,该结构定义所创建 套接口的特性。如果本 参数非零,则前三个参数(af, type, protocol)被忽略。
g:保留给未来使用的套接字组。 套接口组的标识符。
iFlags: 套接口属性描述。
这里说一下 WSASocket是window所特有的,支持异步传输的socket()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值