socket基础

sock是对通信端点的抽象;类似于“文件”


小端字节: 英特尔 linux 0x1234;34存在低地址上;
网络上: 大端地址;


//sock初始化所需要的地址  
struct sockaddr {  
   unsigned short sa_family; /* 地址家族, AF_xxx */  
   char sa_data[14]; /*14字节协议地址*/  
   };  


serv_sock=socket(PF_INET,sock_type,ppe->p_proto); 


//AF_INET ipv4;  
   struct in_addr {  
   unsigned long s_addr;  /* 存4字节的 IP 地址*/  
   };  
struct sockaddr_in {  
   short int sin_family; /* 通信类型AF */  本机字节顺序
   unsigned short int sin_port; /* 端口 */  网络字节顺序/*  0随机选择一个没有使用的端口 */
   struct in_addr sin_addr; /* Internet 地址 */  网络字节顺序/*  INADDR_ANY; 使用自己的任意IP地址,任意网卡*/
   unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/  
   };  


//ipv6 地址




struct in6_addr{};


struct sockaddr_in6{}

htons()--"Host to Network Short" //端口号是2字节
htonl()--"Host to Network Long" 
ntohs()--"Network to Host Short" 
ntohl()--"Network to Host Long" 


ina.sin_addr.s_addr = inet_addr("132.241.5.10"); 
printf("%s",inet_ntoa(ina.sin_addr)); 


///*******************地址查询*************************//


主机,网络,协议,服务


//主机hostent    查找地址


int gethostname(char *hostname, size_t size); //获取主机名
gethostbyname(const char *name);   // www.baidu.com   gethostbyname("pzhp-PC");
gethostbyaddr();


gethostent()
sethostent()
endhostent()


typedef struct hostent {
  char FAR      *h_name;
  char FAR  FAR **h_aliases;
  short         h_addrtype;
  short         h_length;
  char FAR  FAR **h_addr_list; //网络字节序
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;




//网络netent  


getnetbyaddr();
getnetbyname();


getnetent();
setnetent()
endnetent()


//协议protoent   查找协议号
getprotobyname(const char FAR * name);  getprotobyname(“udp”);
getprotobynumber()


getprotoent()
setprotoent()
endprotoent()


struct protoent {
  char FAR * p_name;
  char Far * far * p_aliases;
  short p_proto; //以主机字节顺序排列的协议号
  };




//服务  查找熟知端口


getservbyname(const char Far * name, const char FAR *proto);  getservbyname(“smtp”, “tcp“)
getservbyport()


setservent()
endservent()


  struct servent {
  char FAR * s_name;
  char Far * FAR * s_aliases;
  short s_port;
  char FAR * s_proto;
  };


getsockname()//找socket绑定的地址
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); //连接上,找对方地址


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


socket(域,类型,协议号);
int socket(int domain, int type, int protocol);  
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);  //有时候不需要显示绑定端口,


//客服端::确定协议(协议号),获取服务器的地址,端口(服务)
记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用 


UDP,系统套接字接口会为你自动加上了目标和源的信息。 
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);  //阻塞,非阻塞立马返回-1


//服务器
int listen(int sockfd, int backlog);// backlog等待连接数 <20
int accept(int sockfd, void *addr, int *addrlen);  //阻塞,非阻塞返回-1


//交互:
send()
sendto()
sendmsg()


recv()
recvfrom()
recvmsg()


int send(int sockfd, const void *msg, int len, int flags);     //flags可置0
int recv(int sockfd, void *buf, int len, unsigned int flags); //flags可置0


int sendto(int sockfd, const void *msg, int len, unsigned int flags,  const struct sockaddr *to, int tolen);  
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); 


closesocket(sockfd); 


int shutdown(int sockfd, int how); 0 - 不允许接受 1 - 不允许发送  2 - 不允许发送和接受(和 close() 一样) //双工通信确定;


int select(int numfds, fd_set *readfds, fd_set *writefds,fd_set  *exceptfds, struct timeval *timeout); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值