cppsocket01 -- 一个最简单的socket

0、写在前面

本系列主要负责记录学习cpp socket编程的经验,初次学习,难免有不全面的地方!!!

参考内容:30天自制C++服务器

1、最基本的socket

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; //address family
u_short sin_port; //16 bit TCP/UDP port number
struct in_addr sin_addr; //32 bit IP address
char sin_zero[8]; //not use, for align
};

我们使用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
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(8888);

//将socket地址与文件描述符绑定
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));

最简单的服务器已经完成!!!


cppsocket01 -- 一个最简单的socket
http://example.com/2023/08/24/cppsocket01/
作者
Anhongzhan
发布于
2023年8月24日
许可协议