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_UNIX

  • type:指定socket类型
    SOCK_STREAM(流传输)、SOCK_DGRAM(数据报文形式传输)、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET

  • protocol:就是指定协议
    IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC

  • 返回值:成功非 > 0
    错误 -1

sockaddr_in套接字结构体

  • bzero(变量,变量大小); 把变量初始化为 /0

    • include

  • htons(端口号); 把端口号改为网络字节序

    • include

  • inet_addr(IP地址) 把地址字符串转化为一个网络字节序的整数值
  • inet_ntoa(socketaddr_in.sin_addr) 把网络字节序改为 字符串

    • INADDR_ANY 为监听全端口 htonl(INADDR_ANY);
  1. struct socketaddr_in seraddr;
  2. seraddr.sin_family = (socket 第一个参数); //设置地址家族
  3. seraddr.sin_port = htons(8888); // 设置端口
  4. seraddr.sin_addr.s_addr = inet_addr("0.0.0.0"); //设置地址
  5. //或者
  6. 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:对应的是地址的长度
  1. if(-1 == bind(sockt,(struct sockaddr*)(&ser_addr),sizeof(sockaddr)) exit(1);
  2. // sockt 为 socket 函数的返回值
  3. // 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 成功非负整数

  1. struct sockaddr_in cliaddr;
  2. int clis = 0;
  3. socklen_t addr_len = sizeof(struct sockaddr_in);
  4. clis = accept(sers,(struct sockaddr*)c(&cliaddr),&addr_len);
  5. //sers 为创建sock 返回值

不同进程之间的通信函数

  • read() / write()

  • recv()/send()

  • readv()/writev()

  • recvmsg()/sendmsg()

  • recvfrom()/sendto()

  1. #include <unistd.h>
  2. ssize_t read(int fd, void *buf, size_t count);
  3. ssize_t write(int fd, const void *buf, size_t count);
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  7. ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  8. ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
  9. ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  10. ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
  11. ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

close()函数

作用:关闭相应的socket

  1. #include <unistd.h>
  2. int close(int fd);

UDP

  1. 创建SOCKET
  2. 创建 sockaddr_in
  3. 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

  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地址 ( 是网络字节序 )