用c语言编写编写一个基于TCP协议的网络通信程序,要求服务器通过套接字连接后,要求输入用户名,判断用户名正确后,向客户端发送连接正确的字符串,在服务器显示客户端的IP地址和端口。

时间: 2024-02-11 13:04:52 浏览: 25
好的,以下是基于C语言编写的服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main() { // 创建套接字 int server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("创建套接字失败"); exit(EXIT_FAILURE); } // 绑定IP地址和端口 struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(PORT); if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) { perror("绑定失败"); exit(EXIT_FAILURE); } // 监听客户端连接 if (listen(server_socket, 1) == -1) { perror("监听失败"); exit(EXIT_FAILURE); } printf("服务器已启动,等待客户端连接...\n"); while (1) { // 等待客户端连接 struct sockaddr_in client_address; socklen_t client_address_len = sizeof(client_address); int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_len); if (client_socket == -1) { perror("接受客户端连接失败"); continue; } // 接收客户端发送的用户名 char buffer[BUFFER_SIZE]; memset(buffer, 0, BUFFER_SIZE); if (recv(client_socket, buffer, BUFFER_SIZE, 0) == -1) { perror("接收用户名失败"); close(client_socket); continue; } char *username = buffer; // 判断用户名是否正确 if (strcmp(username, "admin") == 0) { // 向客户端发送连接正确的字符串 char *message = "连接成功!"; if (send(client_socket, message, strlen(message), 0) == -1) { perror("发送连接结果失败"); } // 在服务器显示客户端的IP地址和端口 printf("客户端 %s:%d 连接成功!\n", inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port)); } else { // 向客户端发送连接错误的字符串 char *message = "连接失败!用户名错误。"; if (send(client_socket, message, strlen(message), 0) == -1) { perror("发送连接结果失败"); } } // 关闭客户端套接字 close(client_socket); } // 关闭服务器套接字 close(server_socket); return 0; } ``` 以下是基于C语言编写的客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define IP_ADDRESS "127.0.0.1" #define PORT 8888 #define BUFFER_SIZE 1024 int main() { // 创建套接字 int client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket == -1) { perror("创建套接字失败"); exit(EXIT_FAILURE); } // 连接服务器 struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr(IP_ADDRESS); server_address.sin_port = htons(PORT); if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) { perror("连接服务器失败"); exit(EXIT_FAILURE); } // 输入用户名 char username[BUFFER_SIZE]; printf("请输入用户名:"); fgets(username, BUFFER_SIZE, stdin); username[strcspn(username, "\n")] = '\0'; // 发送用户名给服务器 if (send(client_socket, username, strlen(username), 0) == -1) { perror("发送用户名失败"); close(client_socket); exit(EXIT_FAILURE); } // 接收服务器发送的连接结果 char buffer[BUFFER_SIZE]; memset(buffer, 0, BUFFER_SIZE); if (recv(client_socket, buffer, BUFFER_SIZE, 0) == -1) { perror("接收连接结果失败"); close(client_socket); exit(EXIT_FAILURE); } // 输出连接结果 printf("%s\n", buffer); // 关闭套接字 close(client_socket); return 0; } ``` 这个程序和之前Python版本的程序实现的功能是一样的,可以实现输入用户名进行连接,并根据用户名判断连接是否成功。在服务器端,我们通过套接字接收客户端发送的用户名,并判断用户名是否正确,如果正确则向客户端发送连接成功的消息,并在服务器端显示客户端的IP地址和端口;如果用户名不正确,则向客户端发送连接失败的消息。在客户端,我们先输入用户名,然后将用户名发送给服务器,接收服务器返回的连接结果并输出。

相关推荐

最新推荐

recommend-type

C语言编写基于TCP和UDP协议的Socket通信程序示例

主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
recommend-type

使用C语言编写基于TCP协议的Socket通讯程序实例分享

主要介绍了使用C语言编写基于TCP协议的Socket通讯程序实例分享,能够实现包括重新连接与每分钟通信一次等的功能,需要的朋友可以参考下
recommend-type

使用C语言编写圣诞表白程序

圣诞节快到了,让我们用C语言制作一个圣诞表白程序吧,下面通过本文学习下实现代码
recommend-type

在C语言中输入一个大写字母,将其转变成一个小写字母,并且有相应的提示。

1.学习简单的C语言编程
recommend-type

如何基于C语言socket编程实现TCP通信

本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。