linux下的网络编程接口

谁说我不能喝 提交于 2019-12-23 03:41:31
    LINUX 网络编程接口
---------------------------------------------------------------------------
linux 支持的网络编程接口:
 UNIX:  unix域套接字接口
 INET:  Internet地址族TCP/IP支持通信
 AX25:  AMATERUR RADIO X25
 IPX:  Novell IPX
 APPLETALK: Appletalk DDP
 x25:  X25
 
linux的BSD套接口支持的套接口类型
 流失:stream
 数据报:DATAGRAM
 原始: Raw
 
数据结构:
 struct sockaddr{
   //这个结构中存储着套接字接口的地址信息
  Unsigned short sa_family; //地址家族
  char sa_data[14];  //14字节的地址信息
  
   //sa_family的值很多。一般采用AF_INET
   //sa_data的值包括目标地址和端口
 }
 
 struct sockaddr_in{
  
  short int sin_family;  //address family
  unsignet short int sin_port; //port number
  struct in_addr sin_addr; //internet address
  unsigned char sin_zero[8]; //same size as struct sockaddr
 
  //注意sin_zero应该是用bzero()或memset()置零
 }
 

主要的系统调用:
 1、套接字的创建socket()
  使用系统调用socket()来获得文件按描述符
  
  #include <sys/types.h>
  #include <sys/socket.h>
 
  int socket(int domain,int type,int protocol);
 
 参数说明:(parameter)
  domain:一般设置为AF_INET
  type:指套接字的类型。SOCK_STREAM or SOCK_DGRAM
  protocol:一般情况都设置为0
 
 2、绑定套接字bind()
  使用bind()函数将创建的套接接口与本地某一个端口进行绑定
  
  #include <sys/types.h>
  #include <sys/socket.h>
  
  int bind(sockfd,struct sockaddr* *my_addr,int add_len );
 参数说明:
  sockfd:已经创建的套接字描述符
  my_addr:指向数据结构sockaddr的指针,该结构中包括了端口和IP
  add_len:地址长度一般使用sizeof(sockaddr)
 
 3、连接connect()
  连接请求
  
  #include <sys/types.h>
  #include <sys/socket.h>
 
  int connect(int sockfd,struct sockaddr* *serv_addr,int addr_len)
 参数说明:
  sockfd:套接字描述符
  serv_addr:指向数据结构sockaddr的指针,该结构中包括目标IP/端口
 
 4、启动监听listen()
  int listen(int sockfd,int backlog);
 参数说明:
  sockfd:套接字描述符
  backlog:在进入队列中连接的个数
 5、accept()
  远程主机使用connect()连接本地使用listen()监听的端口,进入连接队列。
  需要使用accept()处理它。调用accept()会返回一个全新的套接字描述符,
  用来出去相应的连接。新的连接可以使用send()和recv().
  
  #include <sys/socket.h>
  int accpet(int sockfd,void* addr,int *addrlen);
 参数说明:
  sockfd:正在监听端口的套接字描述符
  addr:指向本地的数据结构sockaddr_in的指针。调用connect()中的信息中可以了
   解那个主机的那个端口呼叫。
 6、发送send()和接受recv()
  send调用如下:
  int send(int sockfd,const void* msg,int len,int flags);
 参数说明:
  第一个参数:希望发送数据的套接口描述符
  第二个参数:发送数据的指针
  第三个参数:数据的的长度
  第四个参数:设置成0
  
  recv():读取到缓冲区的字节数。
  size_t recv(int sockfd,void* buf, size_t len,int flags);
 
 7、sendto()和recvfrom()
  以下是关于数据报(UDP)的数据发送与接受
  int sendto(
   int sockfd,
   const void* msg,
   int len,
   int flags,
   const struct sockaddr* to,
   int tolen
  );
 参数说明:
  前几个参数同send()相同
  to:指向目标ip/端口的sockaddr地址结构
  tolen:一般设置成为sizeof(struct sockaddr)
 recvfrom()
  调用格式:
  int recvfrom(int sockfd,void* msg,size_t len,int flags,
   const struct sockaddr* from,int *formlen
  );
 

 8、关闭套接字
  colse(sockfd)  //关别套接字不做任何的读写操作
 
  同样可以使用系统调用shutdown()完成更多的操作
  shutdown(int sockfd,int how);
  参数:
   sockfd:需要关闭操作的套接字描述符
   how:
   0-写入无效
   1-读入无效
   2-关闭
  shutdown()成功返回0,错误返回1
  
 9、getpeername()
  //该函数的作用是,说明谁在连接的另一端
  #include <sys/socket.h>
  int getpeername(int socket,struct sockaddr* addr,int *addrlen);
 
  第一个参数是: 连接的数据流套接口的描述符
  第二个参数是: 指向另一端的信息的数据结构的sockaddr的指针
  第三个参数是: 一般设置成sizeof(struct sockaddr)
  
  调用出错,将返回-1
  如过成功可以使用inet_ntoa() 或者gethostbyaddr()来得到更多的信息。
 
 10、gethostname()
  //返回程序正在运行的计算机的名字
  #include <unistd.h>
  int gethostname(char *hostname,size_t size);
  
  gethostbyname()可以使用这个名字来决定机器的IP
 11、使用IP
  使用inet_ator()可以把类似与127.0.0.1的转换成无符号的整数 
  同样可以是用inet_ntoa()能将整数转换成点分十进制的形式
 
 
 
 关于本机字节顺序和网络自己顺序
  htons:本机短整形顺序转换成网络字节顺序,用于端口
  htonl:本机长整形顺序转换成网络字节顺序,用于IP
  ntohs:网络短整形顺序转换成本机字节顺序,用与端口
  ntohl:网络长整形顺序转换成本机字节顺序,用与IP
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!