邮槽-简单的客户端服务器应用

邮槽是一种单向的方法。也就是说只能由客户端来发送消息,可以有多个服务器来接受消息。并且次链接是广播型的,不安全,容易丢失。

 

但其优点就是容易实现,一般使用邮槽的话,都会在较短的时间内重复发送消息。所以这在一定情况下也弥补了包容易丢失的问题。比如写这样

 

一个应用。写一个每隔五分钟提醒一下公司的可乐售货机上还有多少,每五分钟会给所有的服务器报告一次。

 

开发邮槽客户机和服务器应用时,所有WIN32 API 函数(CreateFile & CreateMailslot除外) 在调用失败的情况下都会 0 值。CreateFile

 

& CreateMailslot 返回的是INVALID_HANDLE_VALUE. 调用失败时,及时调用GetLastError()来获得错误代码。

 

服务器用来创建一个邮槽,然后由客户端来调用写消息,服务器只负责读消息。

 

服务器实现过程:

 

 

 

Client则是引用和使用上面服务器创建的邮槽。

 

对一个邮槽进行引用 要使用 CreateFile 这个API 函数

 

调用 WriteFile 来写,注意最大的消息为64KB

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单客户端服务器端的C语言代码示例,可以实现客户端服务器之间的畅聊: 服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8888 #define MAX_MSG_LEN 1024 int main(int argc, char *argv[]) { // 创建socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 绑定socket和端口 struct sockaddr_in address; 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"); exit(EXIT_FAILURE); } // 监听端口 if (listen(server_fd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } printf("Server started listening on port %d...\n", PORT); // 等待客户端连接 int client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&address); if (client_fd < 0) { perror("accept failed"); exit(EXIT_FAILURE); } printf("Client connected.\n"); // 等待消息 char message[MAX_MSG_LEN]; while (1) { memset(message, 0, MAX_MSG_LEN); int bytes_received = recv(client_fd, message, MAX_MSG_LEN, 0); if (bytes_received < 0) { perror("recv failed"); exit(EXIT_FAILURE); } if (bytes_received == 0) { printf("Client disconnected.\n"); break; } printf("Received message from client: %s\n", message); // 发送消息给客户端 char response[MAX_MSG_LEN]; sprintf(response, "Server received message: %s", message); send(client_fd, response, strlen(response), 0); } // 关闭socket close(server_fd); return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define SERVER_IP "127.0.0.1" #define PORT 8888 #define MAX_MSG_LEN 1024 int main(int argc, char *argv[]) { // 创建socket int client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 连接服务器 struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr(SERVER_IP); server_address.sin_port = htons(PORT); if (connect(client_fd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) { perror("connection failed"); exit(EXIT_FAILURE); } printf("Connected to server.\n"); // 发送消息给服务器 char message[MAX_MSG_LEN]; while (1) { printf("Enter message to send to server: "); fgets(message, MAX_MSG_LEN, stdin); message[strcspn(message, "\n")] = 0; int bytes_sent = send(client_fd, message, strlen(message), 0); if (bytes_sent < 0) { perror("send failed"); exit(EXIT_FAILURE); } if (strcmp(message, "exit") == 0) { printf("Disconnected from server.\n"); break; } // 接收服务器的响应消息 char response[MAX_MSG_LEN]; int bytes_received = recv(client_fd, response, MAX_MSG_LEN, 0); if (bytes_received < 0) { perror("recv failed"); exit(EXIT_FAILURE); } printf("Received message from server: %s\n", response); } // 关闭socket close(client_fd); return 0; } ``` 运行以上代码后,可以在客户端输入消息并发送给服务器服务器会将接收到的消息回复给客户端。当客户端输入“exit”时,程序结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值