TCP 回射程序

本文介绍了TCP回射程序的工作流程,包括客户端发送文本到服务器,服务器回射文本到客户端,以及客户端显示回射内容。同时,文章提到了服务器子进程在终止时会进入僵死状态的问题,由于未捕获特定信号,导致该问题未得到解决。
摘要由CSDN通过智能技术生成

TCP回射程序

回射程序步骤

  1. 客户端从标准输入读入一行文本,并发给服务器
  2. 服务器从网络输入读入这行文本,并且回射给客户
  3. 客户从网络输入读入这行回射文本,并且显示在标准输出上。

回射流程

这里写图片描述

TCP 回射服务器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <strings.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <errno.h>

// 服务器从网络读入和返回

void str_echo(int sockfd) {
    ssize_t n;
    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于基于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回射服务器程序,并且在客户端发送数据后,对其进行大小写字母转换后再发送回客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值