0、写在前面 本系列主要负责记录学习cpp socket编程的经验,初次学习,难免有不全面的地方!!!
参考内容:30天自制C++服务器
1、最基本的socket socket,中文名称为套接字,是计算机之间进行通信的一种约定,通过socket这种约定,我们就能实现计算机之间的通信。
socket编程属于网络编程的一部分,既然涉及到网络,就必须包含客户端和服务端
2、服务端 socket 我们按照上图的流程来,首先是创建socket
1 2 #include <sys/socket.h> int sockfd = socket (AF_INET, SOCK_STREAM, 0 );
第一个参数表示IP地址类型,AF_INET表示IPv4,AF_INET6表示IPv6
第二个参数表示数据传输方式,SOCK_STREAM表示流格式、面向连接,多用于TCP。SOCK_DGRAM表示数据报格式、无连接,多用于UDP
第三个参数表示协议,0表示根据前面两个参数自动推导协议类型,IPPROTO_TCP和IPPTOTO_UDP分别表示TCP和UDP
bind 计算机网络中,主机之间通信需要通过IP地址,主机中的进程通信则需要额外知道端口号
sockaddr_in负责存储主机和端口号,其数据结构如下:
1 2 3 4 5 6 struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8 ]; };
我们使用bzero函数初始化这个数据结构,bzero会将内存区域前n个字节全部设为0
1 2 3 4 5 6 7 8 9 10 11 #include <arpa/inet.h> struct sockaddr_in serv_addr;bzero (&serv_addr, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr ("127.0.0.1" ); serv_addr.sin_port = htons (8888 );bind (sockfd, (sockaddr*)&serv_addr, sizeof (serv_addr));
listen 1 listen (sockfd, SOMAXCONN);
listen的第二个参数是Listen函数的最大监听队列长度,SOMAXCONN表示128
accept 一旦监听到客户端的连接,我们就需要使用accept函数接收该连接
1 2 3 4 5 struct sockaddr_in clnt_addr;socklen_t clnt_addr_len = sizeof (clnt_addr);bzero (&clnt_addr, sizeof (clnt_addr));int clnt_sockfd = accept (sockfd, (sockaddr*)&clnt_addr, &clnt_addr_len);printf ("new client fd %d! IP: %s Port: %d\n" , clnt_sockfd, inet_ntoa (clnt_addr.sin_addr), ntohs (clnt_addr.sin_port));
3、客户端 socket 1 2 3 int sockfd = socket (AF_INET, SOCK_STREAM, 0 );struct sockaddr_in serv_addr;bzero (&serv_addr, sizeof (serv_addr));
connect 1 2 3 4 serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr ("127.0.0.1" ); serv_addr.sin_port = htons (8888 );connect (sockfd, (sockaddr*)&serv_addr, sizeof (serv_addr));
最简单的服务器已经完成!!!