linux socket 基础知识一

一直以来都在做底层网络的开发,最近开始接触socket编程。发现很多书上面基础知识总结的并不精练,而且交代不清,于是决定把我的收获贡献出来。

一:认识socket

  什么是socket,socket本质包含两个信息--IP和port。但是实际用的过程中你会发现这个词会用在好几种情况下,主要是两种情况。一是,int sockfd=socket(...),

此时返回的值是socket;两外一种情况是struct sockaddr,该结构体ipv6的版本是struct sockaddr,其中包括ip和port ;其实本质上socket是struct sockaddr,有些程序

sockfd在并没有明显绑定Ip和port 的情况下就可以和远程的计算机通讯,那是因为系统会为没有绑定的sockfd绑定一个合适的ip和port,并在以后的通讯中一直使用。关于

socket还有一个你不得不知道的一个信息,那就是类型,socket有好几种类型,主要有SOCK_STREAM SOCK_DREAM SOCK_RAM ,这些类型是在socket()函数中指定的。

二:socket地址的知识

  在大部分的书里面sockaddr定义如下

struct sockaddr
{
   unit8_t sa_len;
  sa_family_t sa_family;
  char sa_data[14]; }

  大部分的服务器linux上,如果你去读取sa_len一定会报错的,因为现在主流的定义应该如下

struct sockaddr
{
  sa_family_t sa_family;
  char sa_data[14];
}

  这是一个通用的结构,总共就16个字节,具体到ipv4和ipv6时,这个结构就变成了另外两个形式,但是他们都占16个字节,所以可以直接类型转换,没有问题。

ipv4socket结构

struct sockaddr_in
  {
    sa_family_t sin_family;
    in_port_t sin_port;            /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */
    unsigned char sin_zero[8]
  };

ipv4 struct in_addr

三:常用函数

<arp/inet.h> inet_addr() inet_ntoa() inet_aton()

<netinet/in.h> htons()  htonl() ntohs()  ntohl()

<unistd.h> close()

常会遇到的数据结构

<sys/types.h> u_int8_t u_int16_t u_int32_t u_int64 _t int8_t  int16_t int32_t int64 _t

<stdint.h> uint8_t uint16_t  uint32_t  uint64_t 

posted on 2012-05-01 16:53  liang_87  阅读(633)  评论(0编辑  收藏  举报

导航