我的理解就是三次握手使用的函数帮助解决(函数内部完成),accept和connect
四次挥手应该就是close直接解决了。 因为在创建套接字的时候是定义的stream流式套接字,是面向连接的。所以就直接是在函数里解决握手与挥手了吧。
这里完全是自己的理解,如果有大佬能回应我会感激到哭
--------------------------------------------------------------------------------------
作为客户端需要知道的事情: 知道服务器的IP地址和端口号。
首先要建立连接
座位客户端,既不需要绑定也不需要监听,只需要连接就可以了。使用函数:
#include<sys/socket.h>
int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
主动和服务器简历链接,如果成功才能传输数据。(相对于TCP协议。)成功返回0,失败返回其它的。
sockfd 套接字
addr 需要链接的服务器地址结构
addrlen 地址结构长度
int sockfd = 0;
ockfd = socket(AF_INET,OCK_STREAM,0);if(sockfd < 0){
perror("socket");
exit(-1);
}
int err_log = 0;// 存储错误
unsigned short port = 8000;//服务器端口
char * server_ip = "192.168.1.2"; // 服务器IP
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET,server_ip,&server_addr.sin_addr); // 将点分十进制转换为32位数,存到server_addr.sin_addr
//主动链接服务器
err_log = connect(sockfd, (struct sockaddr *)&server_addr,sizeof(server_addr));
if(err_log != 0){
perror("connect");
close(sockfd);
exit(-1);
}
因为套接字是一个文件描述符,所以使用read、write 可以直接从这个连接中取出或者写入数据。
但是系统提供了函数进行读写
#include<sys/socket.h>
ssize_t send(int sockfd,const void * buf,size_t nbytes,int flags);
用来发送数据。要注意的是不能用TCP协议发送0长度的数据包。
sockfd : socket套接字
buf : 待发送数据缓存区的地址(要发送的字符串)
nbytes:发送缓存区大小(以字节为单位)
flags : 标志位,通常为0
返回值为成功发送的字节数。
#include<sys/socket.h>
ssize_t recv(int sockfd,const void * buf,size_t nbytes,int flags);
用来接收数据
sockfd : socket套接字
buf : 接收数据缓存区的地址(要接收的字符串)
nbytes:发送缓存区大小(以字节为单位)
flags : 标志位,通常为0
返回值为成功接收到的字节数。
while(1){
char send_buf[512] = "";
char recv_buf[512] = "";
// 标准输入,使用键盘输入,因为是最后结束符,所以被替换成\0无关紧要
fget(send_buf, sizeof(send_buf),stdin);
send_buf[strlen(send_buf)-1] = '\0'; // 结束
/***********************不建议使用******************/
/*//向sockfd发送数据大小为strlen(send_buf)的数据
write(sockfd ,send_buf ,strlen(send_buf));
//从sockfd中读取数据写入到recv_buf中
read(sockfd, recv_buf,sizeof(recv_buf));*/
/***************************************************/
recv(sockfd,send_buf,sizeof(send_buf),0);
send(sockfd,recv_buf,sizeof(recv_buf),0);
}
close(sockfd);
使用close函数就可以关闭套接字。
关闭一个代表着已连接(accept)套接字会导致另一端(客户端)收到一个长度为0的数据包。
- 对于服务器来说,关闭socket创建的监听套接字导致服务器无法进行监听,但是不会影响已经建立的链接。
- 对于服务器来说,关闭accept简历的套接字会导致他所代表的链接被关闭了,但是不会影响服务器的监听。
- 对于客户端来说,关闭连接就是关闭连接了。