mac下面有epoll?

没有的,但是mac下面有kqueue,跟epoll原理是差不多的。
这个是没办法的,如果实在需要,就用Ubuntu吧,这个也可以无缝迁移。
更多资源,更多文章由小白技术社提供(是我啦)

### 关于 Mac 平台上的 Socket 编程 在 Mac OS X 或 macOS 上进行 Socket 编程时,可以利用标准 C/C++ 的 POSIX API 来实现网络通信功能。这些接口与 Linux 下的 Socket 编程非常相似,因此许多跨平台的应用程序可以直接移植到 macOS 而无需修改。 以下是基于 macOS 的一个简单 TCP 客户端和服务器的示例代码: #### 1. **TCP Server 示例** ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int server_fd, new_socket; struct sockaddr_in address; char buffer[BUFFER_SIZE] = {0}; const char *response = "Hello from the server!"; // 创建 socket 文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定 IP 地址和端口号 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); close(server_fd); exit(EXIT_FAILURE); } // 开始监听连接请求 if (listen(server_fd, 3) < 0) { perror("listen failed"); close(server_fd); exit(EXIT_FAILURE); } printf("Server is listening on port %d...\n", PORT); while(1){ if ((new_socket = accept(server_fd, (struct sockaddr *)NULL, NULL)) < 0) { perror("accept failed"); continue; } read(new_socket, buffer, BUFFER_SIZE); // 接收数据 printf("Received message: %s\n", buffer); send(new_socket, response, strlen(response), 0); // 发送响应 printf("Response sent.\n"); close(new_socket); } return 0; } ``` 此代码展示了如何创建一个简单的 TCP 服务器[^1]。它绑定了本地地址并开始监听来自客户端的连接请求。当接收到消息后,服务器会发送一条固定的消息作为回应。 --- #### 2. **TCP Client 示例** 下面是一个基本的 TCP 客户端实现,它可以向上面提到的服务端发送消息并接收回复。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sock = 0; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; const char *hello = "Hello from client"; // 创建 socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); exit(EXIT_FAILURE); } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将 IPv4 和 IPv6 地址转换成二进制形式 if(inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr)<=0) { perror("Invalid address/ Address not supported "); close(sock); exit(EXIT_FAILURE); } // 连接到服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Connection Failed"); close(sock); exit(EXIT_FAILURE); } // 向服务器发送消息 send(sock , hello , strlen(hello) , 0 ); printf("Message sent to server: %s\n", hello); // 接收服务器发回的数据 read(sock , buffer, BUFFER_SIZE); printf("Message received from server: %s\n",buffer); close(sock); return 0; } ``` 该客户端尝试连接至运行在同一机器上的服务端(IP 设置为 `127.0.0.1`),并向其发送字符串 `"Hello from client"`,随后等待并打印从服务端返回的信息。 --- #### 配置环境 为了编译以上两个例子,在终端输入如下命令即可完成编译过程: ```bash gcc -o tcp_server tcp_server.c gcc -o tcp_client tcp_client.c ``` 之后分别执行生成的可执行文件来测试它们之间的交互情况。 --- #### 注意事项 - 在实际开发过程中需要注意异常处理以及资源释放等问题。 - 如果计划支持更多的并发用户,则应考虑采用多线程或多进程模型或者事件驱动架构如 epoll/select/poll 等机制[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值