Linux下socket编程学习(2)

int accept(int sock, struct sockaddr * addr, int* addrlen)

addrlen:初始指明为addr的大小,调用返回时为存储在addr中的字节数 ### close() 终止通信,删除套接字,任何正在套接字上等待被读取的数据都将被抛弃。 linux使用了引用计数机制,可以多个进程共享一个套接字。close每被调用一次,引用计数减1,引用计数为0时才释放。

int close(int sock)

成功时返回0 ### shutdown() 部分关闭连接

int shutdown(int sock,int direction )

direction:0,终止进一步输入;1,终止进一步输出;2,终止输入和输出 ## 辅助函数 ### 整数转换 TCP/IP协议首部使用的二进制采用网络字节顺序(表示整数时,最高字节在前) 为了机器和网络字节顺序兼容,应当始终调用转换函数

htons(host to network short)
ntohs
htonl
ntohl

### 地址转换inet_addr 接受字符串(点分十进制),返回等价二进制表示的地址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
```

查找域名对应ip地址gethostbyname

接收ASCII字符串域名,返回hostent结构,定义在<netdb.h>中

struct hostent { char* h_name, //正式主机名 char** h_aliases, //其他别名列表 int h_addrtype, //地址类型 int h_length, //地址长度 char** h_addr_list //一般主机可以有多个ip地址,h_addr_list用来 保存多个ip地址 } #define h_addr h_addr_list[0] //为了与早期的版本兼容

由服务名字得到熟知端口getservbyname

成功则返回一个servent结构指针,发生差错就返回空指针,结构定义在<netdb.h>中

servent* getservbyname(char\* name, char\* proto)

struct servent
{
char* s_name; //正式服务名
char** s_aliases; //其他别名列表
int s_port; //该服务使用的端口
char *s_proto; //服务器所用的协议
};
```

根据协议名找到该协议的正式整数值getprotobyname(char* name)

成功就返回protoent结构指针,结构定义在<netdb.h>中

struct protoent { char\* p_name; //协议正式名 char\*\* p_aliases; //协议的别名列表 int p_proto; //正式协议名 }

获取主机名字gethostname

以字符串形式返回主机名

int gethostname(char\* name, namelen)

name:放置名字的字符数组的地址

获取远程端点地址getpeername

需要已经建立链接

int getpeername(int sock, sockaddr\* remaddr, int\* addrlen)

remaddr:含有对端地址的sockaddr指针
addrlen:调用前为第二个参数的长度,调用后为远程端点地址的实际长度

设置/查看套接字参数 getsockopt() setsockopt() 相关头文件 <sys/types.h> //primitive system data types(包含很多类型重定义,如pid_t、int8_t等) <sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等 //上边两个sock调用必须包含 <netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、struct inaddr 、PROTO_ICMP、INADDR_ANY等 <sys/types.h> //primitive system data types(包含很多类型重定义,如pid_t、int8_t等) <sys/socket.h> //与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等 <sys/ioctl.h> //I/O控制操作相关的函数声明,如ioctl() <stdlib.h> //某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等 <netdb.h> //某些结构体定义、宏定义和函数声明,如struct hostent、struct servent、gethostbyname()、gethostbyaddr()、herror()等 <arpa/inet.h> //某些函数声明,如inet_ntop()、inet_ntoa()等 <netinet/in.h> //某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0dcb60a91f6ee776bf8a96eff6a3f4d2.html