linux之socket系列函数

结构体

struct sockaddr_in结构类型是用来保存socket的信息
struct sockaddr_in {
short int sin_family;        //地址家族,一般来说 AF_INET(地址族)PF_INET(协议族 )
unsigned short int sin_port; //端口号
struct in_addr sin_addr;     //网络地址
unsigned char sin_zero[8];   //没有实际意义,只是为了跟SOCKADDR结构在内存中对齐 
};
struct hostent结构类型是用来保存主机的信息
struct hostent{
char    *h_name;             //主机的规范名             
char    **h_aliases;         //主机的别名
int     h_addrtype;          //主机ip地址的类型:AF_INET或者AF_INET6
int     h_length;            //主机ip地址的长度
char    **h_addr_list;       //主机的ip地址,以网络字节序存储。
#define h_addr h_addr_list[0] 
}; 
struct iovec{
void *iov_base;              //指向一个缓冲区,这个缓冲区是存放接收的数据或是将要发送的数据
size_t iov_len;              //接收数据的最大长度以及实际写入数据的长度
};
struct msghdr{
void       *msg_name;        //主机ip地址
socklen_t  msg_namelen;      //主机ip地址的长度
struct     iovec  *msg_iov;  //缓冲区
int        msg_iovlen;       //缓冲区的长度
void       *msg_control;     //附属数据缓冲区
socklen_t  msg_controllen;   //附属数据缓冲区大小
int        msg_flags;        //信息标记位

socket函数


1、建立socket

需要头文件:sys/types.h、sys/socket.h 
调用成功,返回socket文件描述符;失败,返回-1,并设置errno


int socket(int domain, int type, int protocol);
domain:                     //指明所使用的协议族,通常为PF_INET,表示TCP/IP协议;
type:                       //指定socket的类型,基本上有三种:数据流套接字(SOCK_STREAM)、
                             //数据报套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)
protocol:                   //通常赋值0。

2、bind函数

需要头文件:sys/types.h、sys/socket.h 
将套接字和指定的端口相连。成功返回0,否则,返回-1,并置errno.
int bind(int sock_fd,struct sockaddr_in *my_addr, int addrlen);
sock_fd:                    //调用socket函数返回值,
my_addr:                    //是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;
addrlen:                    //sockaddr的长度

3、connect函数

需要头文件:sys/types.h、sys/socket.h 
客户端发送服务请求。调用成功返回0,否则,返回-1,并置errno.

int connect(int sock_fd, struct sockaddr *serv_addr,int addrlen);
serv_addr:                  //服务器ip地址和端口号
addrlen:                    //结构sockaddr_in的长度。

4、listen函数

需要头文件:sys/socket.h 
等待指定的端口的出现客户端连接。调用成功返回0,否则,返回-1,并置errno.

int listen(int sock_fd, int backlog);
backlog:                    //指定在请求队列中允许的最大请求数

5、accecpt函数

需要头文件:sys/socket.h 
接受客户端的服务请求,成功返回新的套接字描述符,失败返回-1,并置errno

int accept(int sock_fd, struct sockadd_in* addr, int addrlen);

6、关闭连接函数

close(sockfd);
需要头文件:unistd.h
int shutdown(int sockfd,int how);
需要头文件:sys/socket.h
how允许为shutdown操作选择以下几种方式:
0-------不允许继续接收数据
1-------不允许继续发送数据
2-------不允许继续发送和接收数据

数据传输函数


1、write/read函数

write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量.
Read函数是负责从fd中读取数据到buf内。成功返回实际读取到的字节数,如果返回值是0,表示已经读取到文件的结束了,小于0表示是读取错误。

ssize_t write(int fd,const void *buf,size_t nbytes)
ssize_t read(int fd,void *buf,size_t nbyte)

2、send/recv函数

int send(int sockfd, const void *buf, int len, unsigned int flags);
int recv(int sockfd,void *buf,int len,unsigned int flags);
buf:                  //指向要发送数据的指针
len:                  //以字节为单位的数据的长度
flags:                //一般情况下置为0。

3、sendto/recvfrom函数

int sendto(int sockfd,const void *buf,int len,unsigned int flags,const struct sockaddr *to, int tolen);
int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen)
buf:                  //指向发送/接受的数据存放的地方。
flags:                //一般设0
to/from:              //用来指定传送的网络地址
tolen/fromlen:        //sockaddr的结构长度。

4、sendmsg/recvmsg函数

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

5、writev/readv函数

ssize_t readv(int filedes,const struct iovec *iov,int iovcnt);
ssize_t writev(int filedes,const struct iovec *iov,int iovcnt);

其它函数


1、字节序转换

需要头文件:netinet/in.h
unsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes

unsigned long int htonl(unsigned long int hostlong):
主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes

unsigned short int ntohs(unsigned short int netshort):
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes

unsigned long int ntohl(unsigned long int netlong):
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes


2、IP地址转换

需要头文件:sys/socket.h
unsigned long int inet_addr(const char * cp):
将一个用点分十进制表示的IP地址的字符串转换成一个无符号长整型,返回转换结果。如果参数char *cp无效,函数返回-1

int inet_aton(const char * cp,struct in_addr * inp):
转换网络主机地址cp为二进制数值,并存储在struct in_addr结构中,即第二个参数inp。函数返回非0表示cp主机有地有效,返回0表示主机地址无效。

char * inet_ntoa(struct in-addr in):
将32位二进制形式的IP地址转换为点分十进制表示的IP地址的字符串,返回转换结果


3、字节处理函数

需要头文件:strings.h
void bzero(void * s,int n):
将参数s指定的内存的前n个字节设置为0,通常它用来将套接字地址清0。

void bcopy(const void * src,void * dest,int n):
从参数src指定的内存区域拷贝指定数目的字节内容到参数dest指定的内存区域。

int bcmp(const void * s1,const void * s2,int n):
比较参数s1指定的内存区域和参数s2指定的内存区域的前n个字节内容,如果相同则返回0,否则返回非0。

void * memset(void * s,int c,size_t n):
将参数s指定的内存区域的前n个字节设置为参数c的内容。

void * memcpy(void * dest,const void * src,size_t n):
功能同bcopy(),区别:函数bcopy()能处理参数src和参数dest所指定的区域有重叠的情况,memcpy()则不能。

int memcmp(const void * s1,const void * s2,size_t n):
比较参数s1和参数s2指定区域的前n个字节内容,如果相同则返回0,否则返回非0。

4、其他


gethostname

需要头文件:unistd.h
获取进程所在机器的计算机的名字

int gethostname(char *hostname, size_t size);
hostname                            //是一个字符数组指针,它将在函数返回时保存主机名。
size是hostname                      //数组的字节长度。
成功时返回 0,失败时返回 -1,并设置 errno。

gethostbyname

需要头文件:netdb.h、sys/socket.h
用域名或主机名获取IP地址
struct hostent *gethostbyname(const char *name);
这个函数的传入值是域名或者主机名,例如"www.baidu.com"等等。
成功返回一个hostent的结构,失败返回NULL。


linux之socket系列函数,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。