嵌入式技术
#include
//创建网络端点,返回socket文件描述符,失败返回-1设errnoint socket(int domain, int type, int protocol);
domain :协议族(protocol family)(网络通讯(IP)还是本地通讯(xxx.socket))
type :协议(TCP还是UDP还是其他的)
can be bitwised:
Note:
虽然socket返回的sockfd就是一个文件描述符,但不是所有的以文件描述符为参数的函数都可以操作sockfd,比如,和管道文件一样,sockfd同样不能被lseek()操作,下面是一些以文件描述符为参数的函数在操作sockfd时的行为(取自《UNIX环境高级编程》P476)
close() //释放sockfdDup(),dup2() //和一般的文件描述符一样复制fchdir() //失败fchmod() //未指定fchown() //由实现定义fcntl() //支持一些命令,eg:F_DUFD,F_DUPFD_CLOEXEC,F_GETFD,F_GETFL,F_GETOWN,F_SETFD,F_SETFL,F_SETOWNFdatasync()和fsync() //fstat() //由实现定义ftruncate() //未指定ioctl() //支持部分指令,依赖于底层驱动lseek() //由实现定义,失败会设errno为ESPIPEmmap() //未指定poll() //正常工作read()/readv() //与没有flag的recv()等价select() //正常工作write()/writev() //与没有flag的write()等价
//获得sockfd指向的socket的属性int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);//设置sockfd指向的socket的属性,成功返回0,失败返回-1设errno。int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
level :选项级别
optname:选项名
optval:存放选项值的缓冲区地址
optlen:缓冲区长度
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地址}
//主机和网络字节序转换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 byte
//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);
//把通信端口(可能还有地址)和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绑定
//初始化一个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();
//将一个socket设为不活动状态。成功返回0,失败返回-1设errnoint shutdown(int sockfd, int how);
sockfd:socket文件的文件描述符
how:shutdown的方式
当我们close(sockfd)的时候,其实是使引用该文件的文件描述符个数-1,只有当所有引用该文件的文件描述符都被close()时,这个文件才会真正被释放,比如我们在close一个文件描述符之前调用了dup()来复制这个文件描述符,那么这个文件描述符指向的文件表其实还是存在的。当这里的文件描述符指的是socketfd时也是同样的道理。而shutdown()可以直接将该sockfd指向的socket设为不活动状态,那么其他指向该socket的fd也会直接受到影响
//获取主机名gethostname();//获取与socket相连的远程协议的地址getscokname()//获得本地socket协议地址getsockname()//根据主机名获得主机信息gethostbyname()//根据主机地址取主机信息gethostbyaddr()//根据协议名取得主机协议信息getprotobyname()//根据协议号取得主机协议信息getprotobynumber()//根据服务名取得相关服务信息getservbyname()//根据端口号取得相关服务信息getservbyport()
全部0条评论
快来发表一下你的评论吧 !