网络编程中 基于I/O复用的 TCP回射客户-服务器程序设计 如何修改服务器程序 实现大小写字母转换功能
时间: 2024-04-29 13:26:32 浏览: 75
对于基于I/O复用的TCP回射服务器程序,我们可以在读入客户端发送的数据后,先对其进行大小写字母转换,再将转换后的数据发送回客户端即可。
具体实现步骤如下:
1.读取客户端发送的数据,可以使用select()函数进行I/O复用。
2.对读入的数据进行大小写字母转换,可以使用标准库中的toupper()和tolower()函数。
3.将转换后的数据发送回客户端。
下面是一个示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_LINE 1024 /* 最大数据长度 */
int main(int argc, char **argv) {
int i, maxi, maxfd, listenfd, connfd, sockfd;
int nready, client[FD_SETSIZE];
ssize_t n;
fd_set rset, allset;
char buf[MAX_LINE];
socklen_t cliaddr_len;
struct sockaddr_in cliaddr, servaddr;
char *str;
/* 创建socket,即TCP套接字 */
listenfd = socket(AF_INET, SOCK_STREAM, 0);
/* 绑定IP地址和端口号 */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(12345);
bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
/* 监听 */
listen(listenfd, 20);
/* 初始化 */
maxfd = listenfd; /* 初始化最大文件描述符 */
maxi = -1; /* 初始化客户端数组下标 */
for (i = 0; i < FD_SETSIZE; i++)
client[i] = -1; /* 初始化客户端数组 */
FD_ZERO(&allset); /* 初始化文件描述符集 */
FD_SET(listenfd, &allset);
/* 循环处理 */
for (;;) {
rset = allset;
nready = select(maxfd + 1, &rset, NULL, NULL, NULL);
/* 处理新的连接 */
if (FD_ISSET(listenfd, &rset)) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len);
/* 将新的连接添加到客户端数组中 */
for (i = 0; i < FD_SETSIZE; i++)
if (client[i] < 0) {
client[i] = connfd;
break;
}
if (i == FD_SETSIZE) {
printf("too many clients");
exit(1);
}
/* 添加到文件描述符集中 */
FD_SET(connfd, &allset);
if (connfd > maxfd)
maxfd = connfd;
if (i > maxi)
maxi = i;
/* 输出客户端IP地址和端口号 */
printf("new client: %s, port %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));
/* 处理已经连接的客户端 */
for (i = 0; i <= maxi; i++) {
if ((sockfd = client[i]) < 0)
continue;
if (FD_ISSET(sockfd, &rset)) {
if ((n = read(sockfd, buf, MAX_LINE)) == 0) {
/* 连接已经关闭 */
close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
} else {
/* 数据处理 */
int j;
for (j = 0; j < n; j++) {
buf[j] = isupper(buf[j]) ? tolower(buf[j]) : toupper(buf[j]); //大小写字母转换
}
write(sockfd, buf, n);
}
if (--nready <= 0)
break;
}
}
}
}
}
```
以上代码实现了一个基于I/O复用的TCP回射服务器程序,并且在客户端发送数据后,对其进行大小写字母转换后再发送回客户端。
阅读全文