Linux 网络编程
TCP
socket() 函数
作用:用于创建一个socket描述符
- < sys/socket.h >
int socket(int protofamily, int type, int protocol); //返回sockfd
protofamily:协议族
AF_INET(IPV4) AF_INET6(IPV6) AF_LOCAL AF_UNIX AF_UNIXtype:指定socket类型
SOCK_STREAM(流传输)、SOCK_DGRAM(数据报文形式传输)、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKETprotocol:就是指定协议
IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC返回值:成功非 > 0
错误 -1
sockaddr_in套接字结构体
bzero(变量,变量大小); 把变量初始化为 /0
htons(端口号); 把端口号改为网络字节序
- inet_addr(IP地址) 把地址字符串转化为一个网络字节序的整数值
inet_ntoa(socketaddr_in.sin_addr) 把网络字节序改为 字符串
- INADDR_ANY 为监听全端口 htonl(INADDR_ANY);
struct socketaddr_in seraddr;
seraddr.sin_family = (socket 第一个参数); //设置地址家族
seraddr.sin_port = htons(8888); // 设置端口
seraddr.sin_addr.s_addr = inet_addr("0.0.0.0"); //设置地址
//或者
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind() 函数
作用:把一个地址族中的特定地址赋给socket
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket
addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址
- IPV4:struct sockaddr_in
- IPV6:struct sockaddr_in6
- addrlen:对应的是地址的长度
if(-1 == bind(sockt,(struct sockaddr*)(&ser_addr),sizeof(sockaddr)) exit(1);
// sockt 为 socket 函数的返回值
// ser_addr 为 socketaddr_in 的网络套接字结构
listen() 函数
作用:监听 socket
int listen(int sockfd, int backlog);
sockfd:要监听的socket描述字
backlog:可以排队的最大连接个数
返回值:
成功返回0,失败返回-1,并将errno设置为对应的错误。
connect() 函数 客户端连接服务端
作用:发出连接请求 客户端连接服务端 函数
- < sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:为socket地址的长度
返回值
成功为0 失败-1
accept() 函数
作用:接收请求连接 accept默认会阻塞进程
int accept(int sockfd, struct sockaddr _addr, socklen_t _addrlen); //返回连接connect_fd
sockfd:监听套接字,用这个套接字来监听一个端口
addr:它用来接受一个返回值,这返回值指定客户端的地址 可以为NULL
len:用来接受上述addr的结构的大小的 可以为NULL
返回值:
错误为 -1 成功非负整数
struct sockaddr_in cliaddr;
int clis = 0;
socklen_t addr_len = sizeof(struct sockaddr_in);
clis = accept(sers,(struct sockaddr*)c(&cliaddr),&addr_len);
//sers 为创建sock 返回值
不同进程之间的通信函数
read() / write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
close()函数
作用:关闭相应的socket
#include <unistd.h>
int close(int fd);
UDP
- 创建SOCKET
- 创建 sockaddr_in
- bind 在UDP中会直接创建端口
recvfrom() UDP专用连接
是从指定地址接收UDP数据报
int recvfrom( SOCKET s, char FAR buf, int len, int flags,struct sockaddr FAR from, int FAR* fromlen);
头文件
s :标识一个已连接套接口的描述字
buf: 接收数据缓冲区
len: 缓冲区长度
flags: 该参数一般为0
from:(可选)指针,指向装有源地址的缓冲区
fromlen:(可选)指针,指向from缓冲区长度值
返回值:成功:返回接收成功的数据长度
失败: -1
sendto() UDP专用连接
是把UDP数据报发给指定地址
int sendto ( socket s , const void msg, int len, unsigned int flags, const struct sockaddr to , int tolen ) ;
头文件
s: socket描述符
buf: 要发送的数据
len: 发送数据的大小
flags:填0即可
from:(可选)指针,指向装有源地址的缓冲区
fromlen:(可选)指针,指向from缓冲区长度值
返回值: 成功:返回发送成功的数据长度
失败 : -1
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
gethostbyname () 解析DNS域名函数
返回值 失败返回NULL指针
成功返回 hostent 结构struct hostent
- h_name : 表示的是主机的规范名
- h_aliases : 表示的是主机ip地址的类型
- h_length : 表示的是主机ip地址的长度
- h_addr_list : 表示的是主机的ip地址 ( 是网络字节序 )