使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下
1、socket函数
在网络编程中所需要进行的第一件事情就是创建一个socket,无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket文件描述符,类似于文件描述符。socket是一个结构体,被创建在内核中。
sockfd=socket(AF_INET,SOCK_STREAM,0); //AF_INT:ipv4, SOCK_STREAM:tcp协议
2、connect函数
客户端创建了socket后,需要和服务器端建立连接,此时使用connect函数和服务器端进行连接。
connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))
三次握手:
3、bind函数
把一个本地协议地址和套接口绑定,比如把本机的2222端口绑定到套接口。注意:为什么在上图中客户端不需要调用bind函数?这是因为如果没有调用bind函数绑定一个端口的话,当调用connect函数时,内核会为该套接口临时选定一个端口,因此可以不用绑定。而服务器之所以需要绑定的原因就是,所以客户端都需要知道服务器使用的哪个端口,所以需要提前绑定。
bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))
4、listen函数
当socket创建后,它通常被默认为是主动套接口,也就是说是默认为要马上调用connect函数的,而作为服务器是需要被动接受的,所以需要调用linsten函数将主动套接口转换成被动套接口。调用linsten函数后,内核将从该套接口接收连接请求。
/**
* 3:调用listen函数监听(指定port监听)
* 通知操作系统区接受来自客户端链接请求
* 第二个参数:指定队列长度
*/
if(listen(sockfd,10) < 0)
{
perror("listen error");
}
5、accept函数
此函数返回已经握手完成的连接的套接口。注意:此处的套接口不同于服务器开始创建的监听套接口,此套接口是已经完成连接的套接口,监听套接口只是用来监听。
accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);
6、write函数
调用IO函数(read/write)和连接的客户端进行双向通信。
long t = time(0);
char *s = ctime(&t);
size_t size = strlen(s) * sizeof(char);
//将服务器的系统时间写到客户端
if(write(fd,s,size) != size)
{
perror("write error");
}
7、close函数
数据传输完成后,需要关闭套接口
//关闭socket
close(fd);
原文:https://www.cnblogs.com/jgg54335/p/14743335.html