sock 基础

socket() --得到文件描述符!

bind() --我们在哪个端口?

connect() --Hello!

listen() --有人给我打电话吗?

accept() --"Thank you for calling port 3490."

send() 和 recv() --Talk to me, baby!

sendto() 和 recvfrom() --Talk to me, DGRAM-style

close() 和 shutdown() --滚开!

getpeername() --你是谁?

gethostname() --我是谁?

 

   
IPv4 
套接口地址结构

struct in_address {
in_addr_t s_addr ;
}
// 32bits IPv4 
地址
//
网络字节顺序 Network Byte Order

struct sockaddr_in{
unit8_t sin_len; //
长度成员无需设置

sa_family_t sin_family; //
套接口结构地址族,AF_INET
in_port_t sin_port; //16
TCP  UDP 端口号

struct in_addr sin_addr; //32
TCP  UDP 端口地址
char sin_zero[8]; //
未用
}
//in: internet
//s: socket


--------------------------------------------------------------------------------

通用套接口地址结构
套接口地址结构仅在给定主机上使用。结构中的某些成员(IP地址和端口号)用在不同主机

间的通信中,但结构本身并不参与通信.

当作为参数传递给任一个套接口函数时,套接口地址结构总是通过指针来传递,但通过指


针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址结构.

通用套接口结构


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

通用的套接口地址结构的用途:给指向持定于协议的地址结构的指针转换类型。


--------------------------------------------------------------------------------

强制类型转换
函数的调用:

将指向特定于协议的套接口地址结构的指针类型-> 指向通用套接口地址结构的指针。


函数原型:
int connect( int, struct sockaddr *, socklen_t)

..............
struct sockaddr-in servaddr;

..................

connect(sockfd,(sturct sockaddr *) &servaddr, sizeof(servaddr));
.....................


--------------------------------------------------------------------------------

字节排序函数
一个16位整数,它由2个字节组成。

内存中存储这两个字节有两种方法:

小端字节序:低序字节存储在起始地址

大端字节序:高序字节存储在起始地址

网际协议必须指定一个网络字节序(Network Byte Order)

主机字节序和网络字节序的转换函数:


#include <netinet/in.h>
unit16_t htons(uint16_t host16bitvalue);

unit32_t htons(uint32_t host32bitvalue);

unit16_t ntohs(uint16_t net16bitvalue);

unit32_t ntohs(uint32_t net32bitvalue); 

h : host 
n : network
s : short (16 bits)
l : long (32 bits) 


--------------------------------------------------------------------------------

字节/字节流操纵函数
void bzero(void *dest,size_t nbytes);//
清零

void bcopy(const void *src,void *dest,siz_t nbytes);

int bcmp(const void *ptr1,const void *ptr2,size_t nbytes);

返回:0——相等,非0——不相等
void *memset(void *dest,int c,size_t len);

void *memcpy(void *dest,const void *src,size_t nbytes);

it memcmp(const void *ptr1,const void *ptr2,size_t nbytes);

返回:0——相同,非0——不相同

字节流读写函数

ssize_t readn(int filedes, void * buff, size_t nbytes);

ssize_t writen(int filedes, const void *buff, size_t nbytes);

ssize_t readline(intfiledes, void *buff, size_t maxlen);


--------------------------------------------------------------------------------

地址转换函数
#include <arpe/inet.h>

int inet_aton(const char *strptr,struct in_addr *addrptr);

返回:1——串有效,0——串出错

in_addr_t inet_addr(const char *strptr);

返回:若成功,返回32位二进制的网络字节序地址;若出错,则返回INADDR_NONE

char *inet_ntoa (struct in_addr inaddr);

返回:指向点分十进制数串指针
 

ine-aton 
 strptr 所指的C字符串转换成32位的网络字节序二进制值并通过指针


addrptr
来存储。如果成功返回1,否则返回0

inet-addr 
 strptr 所指的C字符串转换成32位的网络字节序二进制值并通过涵数值返回。

函数inet-ntoa将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。

: 202.116.34.194.4000 (IP:202.116.34.194 端口4000)

可用于 IPv4  IPv6的函数


int inet_pton(int family,const char *strptr,void *addrptr);

const char *inet_ntop(int family.const void *addrptr,char *strptr,size_t len);

p
 presentation 地址的表示 202.116.34.194

n
 numeric 数值格式
 16bits/32bits integer


family : AF_INET 
 AF_INET6

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值