编写一段C语言代码,要求使用recv()接收客户端的信息,如“client 12345 12345”,将这段信息以空格为界分为三个部分,将后两个数据分别存入username和password两个字符数组中
时间: 2024-12-04 08:27:39 浏览: 56
在C语言中,我们可以使用recv()函数从网络连接中接收客户端的数据,然后使用strtok()函数按照指定分隔符(这里是空格)分割字符串。以下是示例代码:
```c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
struct sockaddr_in server_addr;
int client_sock, bytes_received;
// 创建套接字
if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Error creating socket");
return 1;
}
// 设置服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 假设端口为8080
inet_pton(AF_INET, "localhost", &server_addr.sin_addr);
// 绑定并监听
if (bind(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("Error binding to address");
close(client_sock);
return 1;
}
listen(client_sock, 5);
printf("Server is listening...\n");
// 接收客户端连接请求
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
if ((bytes_received = accept(client_sock, (struct sockaddr *)&client_addr, &addr_len)) == -1) {
perror("Error accepting connection");
close(client_sock);
return 1;
}
char buffer[BUFFER_SIZE];
size_t read_size = recv(client_sock, buffer, BUFFER_SIZE - 1, 0); // 接收数据,去掉最后一个'\0'
buffer[read_size] = '\0'; // 添加结束符
char *token = strtok(buffer, " "); // 使用空格分割字符串
if (!token) {
printf("Invalid input received.\n");
close(client_sock);
return 1;
}
char username[BUFFER_SIZE]; // 假设最多25字节存储用户名
strncpy(username, token, sizeof(username) - 1);
username[sizeof(username) - 1] = '\0';
token = strtok(NULL, " "); // 进行第二次分割获取密码
if (!token) {
printf("Username not followed by password.\n");
} else {
char password[BUFFER_SIZE]; // 假设最多25字节存储密码
strncpy(password, token, sizeof(password) - 1);
password[sizeof(password) - 1] = '\0';
printf("Username: %s\nPassword: %s\n", username, password);
}
close(client_sock);
return 0;
}
阅读全文
相关推荐







