一、服务端
1.创建套接字:socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
domain: 地址族,常用有AF_INET和AF_INET6,分别代表IPv4和IPv6
type: 套接字类型,常用SOCK_STREAM(流格式套接字/面向连接的TCP套接字),
SOCK_DGRAM(数据报套接字/无连接的UDP套接字)
protocol:默认写0,宏:IPPROTO_TCP,IPPROTO_UDP,分别代表TCP和UDP协议
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0); 创建UDP套接字
2.为套接字添加信息(IP地址和端口号):bind()
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
int sockfd: 是socket描述符
const struct sockaddr *addr: 是一个结构体指针
socklen_t addrlen: 是第二个参数,结构体指针的大小,一般用sizeof()就可以搞定
addr结构体的原型是:
struct sockaddr_in {
sa_family_t sin_family; 协议族
in_port_t sin_port; 端口号
struct in_addr sin_addr; IP地址结构体
unsigned char sin_zero[8]; 填充,没有实际意义,只是为跟sockaddr结构在内存
中对齐,这样两者才能相互转换
};
•地址转换API
•把字符串形式的"192.168.1.123"转为网络能识别的格式
int inet_aton(const char* straddr,struct in_addr* addrp);
const char* straddr: 字符串
struct in_addr* addrp: 一个结构体,IP地址
•把网络格式的IP地址转为字符串形式
char* inet_ntoa(struct in_addr inaddr);
struct in_addr inaddr: 一个结构体,IP地址
3.监听网络连接:listen()
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数:
int sockfd: socket的描述符
int backlog: 同时允许几路客户端和服务器进行正在连接的过程(正在三次握手)
4.监听到有客户端接入,开始接收连接:accept()
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
int sockfd: socket描述符
struct sockaddr *addr: 客户端的协议地址,一个结构体,如果不关心,写NULL
socklen_t *addrlen: 客户端地址长度,如果不关心,写NULL
5.数据收发
TCP数据收发常用第一套API
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
TCP数据收发常用第二套API:有连接
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);
二、客户端
1.创建套接字:socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
domain: 地址族,常用有AF_INET和AF_INET6,分别代表IPv4和IPv6
type: 套接字类型,常用SOCK_STREAM(流格式套接字/面向连接的TCP套接字),
SOCK_DGRAM(数据报套接字/无连接的UDP套接字)
protocol:默认写0,宏:IPPROTO_TCP,IPPROTO_UDP,分别代表TCP和UDP协议
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0); 创建UDP套接字
2.连接服务器:connect()
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
int sockfd: 客户端的socket描述符
const struct sockaddr *addr: 客户端服务器的IP地址和端口号,一个结构体
socklen_t addrlen: 是第二个参数,结构体指针的大小,一般用sizeof()就可以搞定
3.数据收发
TCP数据收发常用第一套API
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
TCP数据收发常用第二套API:有连接
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);