在Linux系统中,用c语言编写一个基于TCP协议的网络通信程序,要求服务器通过套接字连接后,要求输入用户名,判断用户名正确后,向客户端发送连接正确的字符串,在服务器显示客户端的IP地址和端口。
时间: 2024-02-11 09:04:34 浏览: 87
好的,这是一个比较具体的问题,我来和你逐步分析实现过程。
首先,我们需要了解一些基础知识。
TCP协议是一种面向连接的协议,通信前需要建立连接,通信后需要释放连接。客户端和服务端通过套接字(socket)进行通信,套接字是一种抽象的概念,是通信的一种方式,可以理解成通信的端点。
在C语言中,可以使用socket API进行套接字编程。常用的函数有socket、bind、listen、accept和connect等。
有了这些基础知识后,我们可以开始编写代码了。以下是客户端和服务端的代码实现。
服务端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8888
#define MAXLINE 1024
int main() {
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t clilen;
char buf[MAXLINE];
char name[20] = "admin";
// 创建socket
listenfd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定地址和端口
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
// 监听连接请求
listen(listenfd, 10);
printf("listening...\n");
while (1) {
// 接受连接请求
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
// 打印客户端IP地址和端口号
printf("connection from %s, port %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 接收客户端发送的用户名
bzero(buf, MAXLINE);
read(connfd, buf, sizeof(buf));
printf("receive username: %s\n", buf);
// 判断用户名是否正确
if (strcmp(buf, name) == 0) {
// 发送连接正确的字符串
write(connfd, "connection successful", strlen("connection successful") + 1);
} else {
write(connfd, "username error", strlen("username error") + 1);
}
// 关闭连接
close(connfd);
}
return 0;
}
```
客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8888
#define MAXLINE 1024
int main() {
int sockfd;
struct sockaddr_in servaddr;
char buf[MAXLINE];
char name[20];
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 设置服务器地址和端口
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址
servaddr.sin_port = htons(PORT); // 服务器端口号
// 连接服务器
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
// 输入用户名
printf("please input your username: ");
scanf("%s", name);
// 发送用户名
write(sockfd, name, strlen(name) + 1);
// 接收服务器的回复
bzero(buf, MAXLINE);
read(sockfd, buf, sizeof(buf));
printf("%s\n", buf);
// 关闭连接
close(sockfd);
return 0;
}
```
在服务端运行程序后,等待客户端连接。在客户端运行程序后,输入用户名后,会连接到服务端,并发送用户名。服务端接收到用户名后,判断是否正确,如果正确则发送“connection successful”的字符串给客户端,否则发送“username error”的字符串给客户端。客户端接收到服务器的回复后,打印出来,并关闭连接。
以上是一个基本的TCP网络通信程序的客户端和服务端的实现,不过还有很多细节需要注意,比如错误处理、超时处理、多线程处理等等。
阅读全文