linux用C语言编写一个基于TCP协议的网络通信服务器程序和客户端程序,要求服务器通过套接字连接后,要求输入用户名,判断用户名正确后,向客户端发送连接正确的字符串,在服务器显示客户端的IP地址和端口。
时间: 2024-02-20 19:59:32 浏览: 92
好的,这个问题需要分几步来回答。
第一步,我们需要了解一下什么是TCP协议和套接字。
TCP协议是一种面向连接的协议,它提供可靠的、有序的、基于字节流的传输服务。在TCP协议中,数据被分割成一些小的数据包,这些数据包被称为TCP报文段,每个报文段都包含了序号和确认信息,以确保数据的可靠传输。TCP协议使用套接字来建立连接和进行数据传输。
套接字是一个抽象的概念,它是一个通信端点,可以用来发送和接收数据。在Linux中,套接字是一种文件类型,可以通过文件描述符来访问。
第二步,我们需要编写服务器程序。
服务器程序的主要功能是监听客户端的连接请求,并处理客户端发送过来的数据。下面是一个基于TCP协议的服务器程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int sockfd, connfd;
struct sockaddr_in servaddr, cliaddr;
char buffer[1024];
char username[20] = "admin"; // 此处为用户名,可以根据需要修改
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8080);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(sockfd, 5);
while (1) {
printf("Waiting for connection...\n");
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, NULL);
printf("Connection accepted from %s:%d\n",
inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
memset(buffer, 0, sizeof(buffer));
read(connfd, buffer, sizeof(buffer));
printf("Received username: %s\n", buffer);
if (strcmp(buffer, username) != 0) {
printf("Invalid username\n");
close(connfd);
continue;
}
printf("Valid username\n");
memset(buffer, 0, sizeof(buffer));
sprintf(buffer, "Connection established with server\n");
write(connfd, buffer, strlen(buffer));
close(connfd);
}
close(sockfd);
return 0;
}
```
这个服务器程序会监听8080端口的连接请求,并在每次接收到客户端连接请求时,先读取客户端发送过来的用户名信息。如果用户名正确,则向客户端发送连接成功的信息,否则关闭连接。
第三步,我们需要编写客户端程序。
客户端程序的主要功能是连接服务器,并发送用户名信息给服务器。下面是一个基于TCP协议的客户端程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int sockfd;
struct sockaddr_in servaddr;
char buffer[1024];
char username[20];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 此处为服务器IP地址,可以根据需要修改
servaddr.sin_port = htons(8080);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
printf("Please enter your username: ");
scanf("%s", username);
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, username, sizeof(buffer));
write(sockfd, buffer, strlen(buffer));
memset(buffer, 0, sizeof(buffer));
read(sockfd, buffer, sizeof(buffer));
printf("%s\n", buffer);
close(sockfd);
return 0;
}
```
这个客户端程序会连接到127.0.0.1地址的8080端口,并发送用户输入的用户名信息。如果服务器返回连接成功的信息,则打印出来。
注意:以上代码仅作为示例,实际应用中需要进行错误处理和安全性检查。
阅读全文