第三章:套接口编程简介

套接口编程简介

IPv4套接口地址结构通常也称为“网际套接口地址结构”

其结构是:

Structsockaddr_in
{
       Uint8_t sin_len;
       Sa_family_t sin_family;
       In_port_t sin_port;
       Struct in_addr sin_addr;
       Char sin_zero[8];
}

Sin_len 是不需要设置的,其中需要sin_family = AF_INET网际协议族,sin_port 是网络字节序的端口,sin_addr 是网络字节的主机地址,sin_zero是不用设置的,主要是在使用这个地址的时候,全部要置为0,

2 为了使套接口函数能够适应所有协议的地址结构,在ANSIC之前就用通用套接口地址如下:

Structsockaddr
{
       Uint8_t sa_len;
       Sa_family_t sa_family;
       Char sa_data[14];
}

和上面的struct sockaddr_t所占的字节数相同,都是16字节

Such as:

Intbind(int fd,sockaddr *addr,socklen_t);

当使用bind进行绑定的时候,就需要吧sockaddr_t转化成sockaddr(因为内部大小是相同的)

3 从进程到内核传递套接口的函数有bind connect sendto这些函数的第三个函数是告诉内核需要在应用层拷贝多少字节数

从内核到进程(应用层)的地址的拷贝有 accept recvfrom getsocketnamegetpeername,

Sockaddr_incli;

Socklen_tlen;

Len =sizeof(cli);

Getpeername(fd,(sockaddr*)&cli, &len)

其中len当传递到内核是告诉内核,我现在需要拷贝到cli中的字节数,使用指针是为了内核告诉应用层说我内核实际的字节数

3 对于某个操作系统是采用大段还是小端存储的一个好办法就是使用union

#include <iostream>
   using namespace std;
   int main()
   {
       union
      {
           short c;
           char s[sizeof(short)];
       }un;
      un.c = 0x0102;
      if(sizeof(short) == 2)
      {
          if(un.s[0] == 1 && un.s[1] == 2)
          {
              cout<<"big _endian"<<endl;
          }
          else if(un.s[0] == 2 && un.s[1] ==1)
          {
              cout<<"small_sndian"<<endl;
          }
          else
          {
              cout<<"unknow"<<endl;
          }
      }
      return 0;
  }

一些主机字节序到网络字节序的转化函数如下:

Uint16_thtons(uint16_t );

Uint32_thtonl(uint32_t );

Uint16_tntohs(uint16_t );

Uint32_tntohl(uint32_t );

三个伯克利内存操作的函数是:

Voidbzero(void* dst, size_t size);是将dst指定的size个字节初始化为0

Voidbcopy(const void* src, void *dst, size_t size); 是将src拷贝到dst,拷贝的个数是size

Intbcmp(const void*ptr1, const void*ptr2, size_t size); 比较ptr1,ptr2 的个数是size

三个ansic的内存操作的函数是:

Memsetmemcopy memcmp

字符串转换成点分十进制地址函数:

Intinet_aton(const char * str, struct in_addr* addptr)

Char*inet_ntoa(struct in_addr* addr);


是支持IPv4 IPv6的

测试是不是套接字函数int isfdtype(int fd,int fdtype)返回值是1是该类型0不是

Fdtype 可设置成S_IFSOCK


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值