LINUX 网络编程接口
---------------------------------------------------------------------------
linux 支持的网络编程接口:
UNIX: unix域套接字接口
INET: Internet地址族TCP/IP支持通信
AX25: AMATERUR RADIO X25
IPX: Novell IPX
APPLETALK: Appletalk DDP
x25: X25
---------------------------------------------------------------------------
linux 支持的网络编程接口:
UNIX: unix域套接字接口
INET: Internet地址族TCP/IP支持通信
AX25: AMATERUR RADIO X25
IPX: Novell IPX
APPLETALK: Appletalk DDP
x25: X25
linux的BSD套接口支持的套接口类型
流失:stream
数据报:DATAGRAM
原始: Raw
流失:stream
数据报:DATAGRAM
原始: Raw
数据结构:
struct sockaddr{
//这个结构中存储着套接字接口的地址信息
Unsigned short sa_family; //地址家族
char sa_data[14]; //14字节的地址信息
//sa_family的值很多。一般采用AF_INET
//sa_data的值包括目标地址和端口
}
struct sockaddr{
//这个结构中存储着套接字接口的地址信息
Unsigned short sa_family; //地址家族
char sa_data[14]; //14字节的地址信息
//sa_family的值很多。一般采用AF_INET
//sa_data的值包括目标地址和端口
}
struct sockaddr_in{
short int sin_family; //address family
unsignet short int sin_port; //port number
struct in_addr sin_addr; //internet address
unsigned char sin_zero[8]; //same size as struct sockaddr
short int sin_family; //address family
unsignet short int sin_port; //port number
struct in_addr sin_addr; //internet address
unsigned char sin_zero[8]; //same size as struct sockaddr
//注意sin_zero应该是用bzero()或memset()置零
}
}
主要的系统调用:
1、套接字的创建socket()
使用系统调用socket()来获得文件按描述符
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
参数说明:(parameter)
domain:一般设置为AF_INET
type:指套接字的类型。SOCK_STREAM or SOCK_DGRAM
protocol:一般情况都设置为0
domain:一般设置为AF_INET
type:指套接字的类型。SOCK_STREAM or SOCK_DGRAM
protocol:一般情况都设置为0
2、绑定套接字bind()
使用bind()函数将创建的套接接口与本地某一个端口进行绑定
#include <sys/types.h>
#include <sys/socket.h>
int bind(sockfd,struct sockaddr* *my_addr,int add_len );
参数说明:
sockfd:已经创建的套接字描述符
my_addr:指向数据结构sockaddr的指针,该结构中包括了端口和IP
add_len:地址长度一般使用sizeof(sockaddr)
使用bind()函数将创建的套接接口与本地某一个端口进行绑定
#include <sys/types.h>
#include <sys/socket.h>
int bind(sockfd,struct sockaddr* *my_addr,int add_len );
参数说明:
sockfd:已经创建的套接字描述符
my_addr:指向数据结构sockaddr的指针,该结构中包括了端口和IP
add_len:地址长度一般使用sizeof(sockaddr)
3、连接connect()
连接请求
#include <sys/types.h>
#include <sys/socket.h>
连接请求
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr* *serv_addr,int addr_len)
参数说明:
sockfd:套接字描述符
serv_addr:指向数据结构sockaddr的指针,该结构中包括目标IP/端口
参数说明:
sockfd:套接字描述符
serv_addr:指向数据结构sockaddr的指针,该结构中包括目标IP/端口
4、启动监听listen()
int listen(int sockfd,int backlog);
参数说明:
sockfd:套接字描述符
backlog:在进入队列中连接的个数
5、accept()
远程主机使用connect()连接本地使用listen()监听的端口,进入连接队列。
需要使用accept()处理它。调用accept()会返回一个全新的套接字描述符,
用来出去相应的连接。新的连接可以使用send()和recv().
#include <sys/socket.h>
int accpet(int sockfd,void* addr,int *addrlen);
参数说明:
sockfd:正在监听端口的套接字描述符
addr:指向本地的数据结构sockaddr_in的指针。调用connect()中的信息中可以了
解那个主机的那个端口呼叫。
6、发送send()和接受recv()
send调用如下:
int send(int sockfd,const void* msg,int len,int flags);
参数说明:
第一个参数:希望发送数据的套接口描述符
第二个参数:发送数据的指针
第三个参数:数据的的长度
第四个参数:设置成0
recv():读取到缓冲区的字节数。
size_t recv(int sockfd,void* buf, size_t len,int flags);
int listen(int sockfd,int backlog);
参数说明:
sockfd:套接字描述符
backlog:在进入队列中连接的个数
5、accept()
远程主机使用connect()连接本地使用listen()监听的端口,进入连接队列。
需要使用accept()处理它。调用accept()会返回一个全新的套接字描述符,
用来出去相应的连接。新的连接可以使用send()和recv().
#include <sys/socket.h>
int accpet(int sockfd,void* addr,int *addrlen);
参数说明:
sockfd:正在监听端口的套接字描述符
addr:指向本地的数据结构sockaddr_in的指针。调用connect()中的信息中可以了
解那个主机的那个端口呼叫。
6、发送send()和接受recv()
send调用如下:
int send(int sockfd,const void* msg,int len,int flags);
参数说明:
第一个参数:希望发送数据的套接口描述符
第二个参数:发送数据的指针
第三个参数:数据的的长度
第四个参数:设置成0
recv():读取到缓冲区的字节数。
size_t recv(int sockfd,void* buf, size_t len,int flags);
7、sendto()和recvfrom()
以下是关于数据报(UDP)的数据发送与接受
int sendto(
int sockfd,
const void* msg,
int len,
int flags,
const struct sockaddr* to,
int tolen
);
参数说明:
前几个参数同send()相同
to:指向目标ip/端口的sockaddr地址结构
tolen:一般设置成为sizeof(struct sockaddr)
recvfrom()
调用格式:
int recvfrom(int sockfd,void* msg,size_t len,int flags,
const struct sockaddr* from,int *formlen
);
以下是关于数据报(UDP)的数据发送与接受
int sendto(
int sockfd,
const void* msg,
int len,
int flags,
const struct sockaddr* to,
int tolen
);
参数说明:
前几个参数同send()相同
to:指向目标ip/端口的sockaddr地址结构
tolen:一般设置成为sizeof(struct sockaddr)
recvfrom()
调用格式:
int recvfrom(int sockfd,void* msg,size_t len,int flags,
const struct sockaddr* from,int *formlen
);
8、关闭套接字
colse(sockfd) //关别套接字不做任何的读写操作
同样可以使用系统调用shutdown()完成更多的操作
shutdown(int sockfd,int how);
参数:
sockfd:需要关闭操作的套接字描述符
how:
0-写入无效
1-读入无效
2-关闭
shutdown()成功返回0,错误返回1
9、getpeername()
//该函数的作用是,说明谁在连接的另一端
#include <sys/socket.h>
int getpeername(int socket,struct sockaddr* addr,int *addrlen);
第一个参数是: 连接的数据流套接口的描述符
第二个参数是: 指向另一端的信息的数据结构的sockaddr的指针
第三个参数是: 一般设置成sizeof(struct sockaddr)
调用出错,将返回-1
如过成功可以使用inet_ntoa() 或者gethostbyaddr()来得到更多的信息。
10、gethostname()
//返回程序正在运行的计算机的名字
#include <unistd.h>
int gethostname(char *hostname,size_t size);
gethostbyname()可以使用这个名字来决定机器的IP
11、使用IP
使用inet_ator()可以把类似与127.0.0.1的转换成无符号的整数
同样可以是用inet_ntoa()能将整数转换成点分十进制的形式
//返回程序正在运行的计算机的名字
#include <unistd.h>
int gethostname(char *hostname,size_t size);
gethostbyname()可以使用这个名字来决定机器的IP
11、使用IP
使用inet_ator()可以把类似与127.0.0.1的转换成无符号的整数
同样可以是用inet_ntoa()能将整数转换成点分十进制的形式
关于本机字节顺序和网络自己顺序
htons:本机短整形顺序转换成网络字节顺序,用于端口
htonl:本机长整形顺序转换成网络字节顺序,用于IP
ntohs:网络短整形顺序转换成本机字节顺序,用与端口
ntohl:网络长整形顺序转换成本机字节顺序,用与IP
htons:本机短整形顺序转换成网络字节顺序,用于端口
htonl:本机长整形顺序转换成网络字节顺序,用于IP
ntohs:网络短整形顺序转换成本机字节顺序,用与端口
ntohl:网络长整形顺序转换成本机字节顺序,用与IP
来源:https://www.cnblogs.com/snakeam/archive/2012/08/18/2645510.html