Unix c 网络编程——编程基础

一个完整socket的相关描述(协议,本地地址,本地端口,远程地址,远程端口);
每个socket有一个本地的唯一socket号,由操作系统分配。


=====================================================================================
#include<sys/socket.h>
int socket(int domain,int type,int protocol); //成功返回描述符,出错返回-1。


domain:
      AF_INET(IPv4因特网域)
      AF_INET6(IPv6因特网域)
      AF_UNIX(UNIX域)
      AF_UNSPEC(未指定)


type:
      SOCK_DGRAM(无连接基于数据报)
      SOCK_STREAM(面向连接基于字节流)
      SOCK_SEQPACKET(面向连接基于数据报)
      SOCK_RAW(IP协议数据报接口)


protocol:
      通常为0,表示选择默认协议。
      (AF_INET、SOCK_DGRAM、UDP)
      (AF_INET、SOCK_STREAM、TCP)
=====================================================================================
字节序列转换


转换端口号:
      htons()   
      ntohs()
转换IP:
      htonl()
      ntohl()
=====================================================================================
通用地址格式
      struct sockaddr{
         unsigned short sa_family;//address族,AF_xxx
         char sa_data[14];        //14字节的协议地址
      }
sa_family一般来说,IPV4使用AF_INET。
sa_data包含了一项远程电脑的地址,端口和套接字的数目,里面的数据是杂溶在一起的
=====================================================================================
因特网地址格式
      struct in_addr{
         in_addr_t s_addr   //ipv4
      };
      struct sockaddr_in{
         short int sin_family;     //地址族
         unsigned short int sin_port;  //端口号
         struct in_addr sin_addr;     //ip地址
         unsigned char sin_zero[8];   //添0
      }
=====================================================================================
地址格式转换
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int domain,const void *addr,char *str,socklen_t cnt);//转换成点分十进制
成功返回字符串指针,出错返回NULL。
int inet_pton(int domain,const char *str,void *addr); //转换成二进制整数
成功返回1,无效格式返回0,出错返回-1。
======================================================================================
套接字域地址绑定
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr *addr,socklen_t len);//绑定地址并在/etc/servies中注册
int getsockname(int sockfd,struct sockaddr *addr,socklen_t alenp);//查找绑定到套接字的地址
int getpeername(int sockfd,struct asockaddr *addr,socklen_t *alenp);//获取对方地址
成功返回0,出错返回-1。
======================================================================================
客户端:
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
成功返回0,出错返回-1.
服务端:
#include <sys/socket.h>
int listen(int sockfd,int backlog);
成功返回0,出错返回-1.
int accept(int sockfd,struct sockaddr *addr,socklen_t len);
======================================================================================
tcp 用write read
======================================================================================
udp 用
#include <sys/socket.h>
ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags);
ssize_t sendmsg(int sockfd,const struct msghdr *msg,int flags);
成功返回发送字节数,出错返回-1.
struct msghdr{
   void *msg_name; //optional address
   socklen_t msg_namelen;  //address size in bytes
   struct iovec *msg_iov;  //array of I/O buffers
   int msg_iovlen; //number of elements in array
   void *msg_control;  //number of ancillary bytes
   int msg_flags;     //flags for received message
}


ssize_t recv(int sockfd ,void *buf,size_t nbytes,int flags);//常用
ssize_t recvfrom(int sockfd ,
                  void *buf,
                  size_t len,
                  int flags,
                  struct sockaddr *addr,
                  socklen_t *addrlen);
ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags);
返回消息字节数,无消息返回0,出错返回-1.
=======================================================================================

你可能感兴趣的:(unix,socket,C语言,网络编程)