**
CS模型下,通信步骤及所需函数常用用法
**
服务器端:
socket—bind—listen—accept—write/read—close
客户端:
socket—connect—write/read—close
1、socket函数的用法
int socket(int domain, int type, int protocol);
//返回值为socket套接字文件描述符,用来监听连接
/*domain:协议族
ipv4环境使用 AF_INET
ipv6环境使用 AF_INET6
type:指定socket类型
TCP使用SOCKET_STREAM
UDP使用SOCKET_DGRAM
protocol:指定协议
默认使用0,系统为你自动安排合适的协议*/
int cfd = socket(AF_INET, SOCKET_STREAM, 0);
2、bind函数的用法
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
//sockfd:socket文件描述
//sockaddr* addr:要绑定给sockfd的协议地址,这个地址根据创建socket时协议的不同而不同
//ipv4环境下
struct sockaddr_in{
sa_family_t sin_family;
in_port_t sin_port
struct in_addr sin_addr;
};
struct in_addr{
in_addr_t s_addr;
};
//hons函数和htonl函数是将本地字节序转化为网络字节序
//INADDR_ANY ,会自动获取服务端的计算机IP地址,方便于多宿主计算机
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(port);//传端口号
serv.sin_addr.s_addr = htonl(INADDR_ANY)//传地址
bind(cfd, (struct sockaddr*)&serv, sizeof(serv));
3、listen函数的用法
int listen(int sockfd, int backlog);
//backlog:可以排队的最大连接数
4、accept函数的用法
int accept(int sockfd, struct sockaddr* addr, socklen_t *addrlen);
//返回一个全新的套接字,该套接字用来通信,发送接收数据
//addr用来返回客户端的连接地址,为传出参数
//addrlen返回协议地址的长度,为传出参数
5、read、write函数
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
//返回值:实际写入、读出的字节数(read函数返回0时表示读到末尾,返回负数为出错;write函数返回负数时表示出错)
//buf:写入、读出的缓冲区
//count:期望写入、读出的字节数
6、close函数
int close(int fd);
7、connect函数的用法:
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
//addr用来传入目标服务器的地址信息
//addrlen为目标服务器地址信息的长度