您的位置首页>企业动态>

Linux IPC socket编程基础

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux IPC socket编程基础问题。头文件 include istd h include

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux IPC socket编程基础问题。

头文件# include istd . h # include sys/type . h # include sys/socket . h # include sys/un . h # include net/in . h # include string . h # include RPA/inet . hsocket()//创建网络端点,并返回套接字文件描述符。如果失败,-1。设置errno int socket (int domain,int type,int protocol);Domain:协议系列(网络通信(IP)或本地通信(xxx.socket))

AF_LOCAL本地通信/AF_UNIX/AF_INET用于实现网络协议AF_INET6用于实现网络协议AF _ IPXIPX-Novell协议af _ netlink内核用户接口设备af _ x25 ITU-t x.25/Iso-8208协议af _ x25业余无线电ax . 25协议AF _ atmpvcass to rawattmpvsaf _ appletalptalaf _ packet低级包接口类型:协议(TCP或UDP或其他)。

SOCK_STREAM//streaming socket,其中包括但不限于TCP协议,有序可靠的双向面向连接的字节流通信模式SOCK_DGRAM//数据报socket,其中包括但不限于UDP协议,不可靠的whats,无连接的数据报通信模式SOCK _ seqpacketock _ RAW//原始socket,可以编写自己的传输层协议Sock _ RDM Sock _。

SOCK_NONBLOCK//将O_NONBLOCK文件状态标识符放在新打开的文件描述符上,并将打开的文件设置为非阻塞。您也可以通过fcntl()实现相同的目标。SOCK_CLOEXEC//将close-on-exec (FD_CLOEXEC)文件标识符放在新打开的文件描述符上。参见open()protocol:的特殊协议,一般给出0注意:sockfd虽然socket返回的是文件描述符,但并不是所有以文件描述符为参数的函数都可以操作sockfd。例如,像管道文件一样,sockfd不能由lseek()操作。以下是操作sockfd时以文件描述符为参数的函数的一些行为(摘自《UNIX环境高级编程》 P476)。

Close() //release sockfdDup()、dup2()//copy fch dir()//fail fchmod()//未指定fcchown()//某些命令受实现定义fcntl()///支持,例如:f _ dufd、f _ dupd _ clo。F_GETOWN、F_SETFD、F_SETFL、F _ SETOWNFdatasync()和fsync() //fstat() //由实现定义。ftruncate() //没有指定ioctl() //支持一些指令,并且依赖于底层驱动lseek() //是由实现定义的。Errno将被设置为espipemap()//不带poll() //正常操作read()/readv() //相当于不带标志的recv()、select() //正常操作write()/writev() //相当于不带标志的write()、getsockopt()/setsockopt()。//获取sockfd指向的套接字的属性int getsockopt (int sockfd,int level,int optname,void * optval,sock len _ t * opt len);//设置sockfd指向的套接字的属性,成功返回0,失败返回-1。设置errno。int setsockopt(int sockfd,int level,int optname,const void *optval,sock len _ t opt len);级别:选项级别。

SOL_SOCKET:指定设置属性为套接字API级别,即通用套接字选项IPPROTO_IP:IP选项。IPPROTO_TCP:TIP选项。选项名。

存储选项值的缓冲地址。

准备的邮寄地址:struct sockaddr{ //主要用于函数的参数类型,很少定义结构变量的使用,称为通用邮寄地址类型//$ man bind sa _ family _ t sa _ family;char sa_data

[14];}struct sockaddr_un{ //准备本地通信的通信地址 //$man un.h sa_family_t sun_family;//协议族,就是socket()的domain的AF_LOCAL char sun_path[];//文件的路径}struct sockaddr_in{ //准备网络通信的通信地址 //$man in.h sa_family_t sin_family; //协议族, 就是socket()的domain的AF_INET in_port_t sin_port; //端口号 struct in_addr sin_addr; //IP地址}struct in_addr{ in_addr_t s_addr; //整数类型的IP地址}htonl()/htons()/ntohl()/ntohs()

//主机和网络字节序转换uint32_t htonl(uint32_t hostlong);converts the unsigned integer hostlong from host byte order to network byte order.uint16_t htons(uint16_t hostshort);converts the unsigned short integer hostshort from host byte order to network byte order.uint32_t ntohl(uint32_t netlong); converts the unsigned integer netlong from network byte order to host byte order.uint16_t ntohs(uint16_t netshort); converts the unsigned short integer netshort from network byte order to host byteinet_aton()/inet_addr()/inet_lnaof()/inet_netof()/inet_network()/inet_ntoa()/inet_makeaddr()

//IP地址格式转换,返回对应格式的IP地址int · inet_aton(const char *cp, struct in_addr *inp);in_addr_t inet_addr(const char *cp); //将字符串形式的IP地址转换为整数类型in_addr_t inet_lnaof(struct in_addr in);in_addr_t inet_netof(struct in_addr in);in_addr_t inet_network(const char *cp);char* inet_ntoa(struct in_addr in); //将结构体类型的IP地址转换为字符串类型struct in_addr inet_makeaddr(int net, int host);bind()

//把通信端口(可能还有地址)和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errnoint bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上addrlen: 通信地址的大小, 使用sizeof();

Note:一个网卡一个MAC和一个ip地址,如果将地址置为INADDR_ANY(就是0),那么表示从所有的网卡接收消息,如果希望只接收特定网卡的消息,就需要将其ip地址与socket绑定

connect():

//初始化一个socket的连接,用在客户端,成功返回0,失败返回-1设errnoint connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上addrlen: 通信地址的大小, 使用sizeof();

shutdown()

//将一个socket设为不活动状态。成功返回0,失败返回-1设errnoint shutdown(int sockfd, int how);

sockfd:socket文件的文件描述符how:shutdown的方式

SHUT_RD关闭socket的读端SHUT_WR关闭socket的写端SHUT_RDWR关闭socket的读端和写端

当我们close(sockfd)的时候,其实是使引用该文件的文件描述符个数-1,只有当所有引用该文件的文件描述符都被close()时,这个文件才会真正被释放,比如我们在close一个文件描述符之前调用了dup()来复制这个文件描述符,那么这个文件描述符指向的文件表其实还是存在的。当这里的文件描述符指的是socketfd时也是同样的道理。而shutdown()可以直接将该sockfd指向的socket设为不活动状态,那么其他指向该socket的fd也会直接受到影响

网络信息检索函数

//获取主机名gethostname();//获取与socket相连的远程协议的地址getscokname()//获得本地socket协议地址getsockname()//根据主机名获得主机信息gethostbyname()//根据主机地址取主机信息gethostbyaddr()//根据协议名取得主机协议信息getprotobyname()//根据协议号取得主机协议信息getprotobynumber()//根据服务名取得相关服务信息getservbyname()//根据端口号取得相关服务信息getservbyport()

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。