博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux单用户CS模型TCP通讯完全注释手册
阅读量:5817 次
发布时间:2019-06-18

本文共 3136 字,大约阅读时间需要 10 分钟。

Linux单用户CS模型TCP通讯完全注释手册

server

描述

  • 实现一个简单的Linux单用户CS通讯,客户端发送一串字符串,服务器将其转换为大写后返回。

server 代码

```#include 
#include
#include
#include
#include
#include
#include
#define SERV_PORT 6666int main(int argc,char *argv[]){ int sfd, cfd;//定义服务器的文件描述符std, 定义客户端的文件描述符cfd, cfd用来与客户端通讯,sfd用来接受客户端接入请求. int len, i;//定义读取客户端数据长度返回值len, 定义操作字符时的循环变量i char buf[BUFSIZ], clie_IP[BUFSIZ];//定义buf接收字符串, 定义clie_IP接收套接字中客户端IP struct sockaddr_in serv_addr, clie_addr;//定义服务器结构体,客户端结构体 socklen_t clie_addr_len;//定义客户端套接字长度 sfd = socket(AF_INET, SOCK_STREAM, 0);//创建一个服务器套接字,返回文件描述符 bzero(&serv_addr, sizeof(serv_addr));//给结构体清零 serv_addr.sin_family = AF_INET;//设置结构体协议族为IPv4 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//设置结构体IP为所有有效网卡的IP,这里需要用htonl将INADDR_ANY转为网络字节序. serv_addr.sin_port = htons(SERV_PORT);//设置端口,这里htons为转为网络字节序 bind(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));//设置文件描述符与结构体绑定(ip, port, 网卡等). listen(sfd, 2);//参数2为半连接及已连接但在等待accept分配文件描述符的连接数的总和,Linux默认最大128(该值可修改) printf("Wait for client connect ...\n"); while(1) { clie_addr_len= sizeof(clie_addr);//初始化客户端结构体长度 cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//给客户端连接分配文件描述符,并保存客户端IP端口等信息到clie_addr结构体中 printf("cfd = ----------%d\n", cfd); printf("client IP : %s, port : %d\n", /*打印客户端IP,端口号,这里从in_addr_t类型转换到字符串类型,需要用inet_ntop函数*/ inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie_addr.sin_port)/*将端口号转换为本地字节序*/ ); do //循环处理客户端请求 { len = read(cfd, buf, sizeof(buf)); write(STDOUT_FILENO, buf, len); for(i = 0; i< len; ++i) { buf[i] = toupper(buf[i]); } write(cfd, buf, len); }while(len); close(cfd);//通讯结束,关闭客户端文件描述符 } close(sfd);//通讯结束,关闭服务器文件描述符 return 0;}```

client代码实现

```#include 
#include
#include
#include
#include
#define SERV_IP "127.0.0.1"#define SERV_PORT 6666int main(int argc,char *argv[]){ int sfd, len;//定义与server通讯的文件描述符sfd, 定义读取到的数据(server发的)的长度len struct sockaddr_in serv_addr;//定义与server通讯的套接字serv_addr char buf[BUFSIZ];//定义buf接收server发送的数据 sfd = socket(AF_INET, SOCK_STREAM, 0);//初始化文件描述符sfd,协议族为AF_INET(即IPv4), 应用协议为SOCK_STREAM(即TCP协议),第三个参数默认0 bzero(&serv_addr, sizeof(serv_addr));//将套接字清零 serv_addr.sin_family = AF_INET;//设置套接字协议族为IPv4 inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);//将IP地址转换为in_addr_t类型存入 serv_addr.sin_port = htons(SERV_PORT);//将端口转为网络字节序存入 connect(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));//按照套接字里服务器信息连接服务器,并设置sfd文件描述符用来通讯 while(1)//与服务器通讯过程,本例为给server发送一行数据,然后打印server发回的数据. { fgets(buf, sizeof(buf), stdin); int ret = write(sfd, buf, strlen(buf)); printf("write ret = %d\n", ret); len = read(sfd, buf, sizeof(buf)); printf("read len = %d\n", len); write(STDOUT_FILENO, buf, len); } close(sfd);//关闭文件描述符 return 0;}```

运行效果

  • 客户端输入:hello,world
  • 服务端转换为大写后返回,客户端收到服务器发回的数据后进行打印:HELLO,WORLD

如图

1309743-20180101211219659-871349802.png

存在问题

  • 仅作学习建立TCP连接使用,不支持多用户,未进行错误处理。

转载于:https://www.cnblogs.com/nonsupport/p/8168940.html

你可能感兴趣的文章
[轉]redis;mongodb;memcache三者的性能比較
查看>>
微软职位内部推荐-Sr DEV
查看>>
用计算器计算“异或CRC”
查看>>
让你的WPF程序在Win7下呈现Win8风格主题
查看>>
深刻理解C#的传值调用和传引用调用
查看>>
Windows环境配置Apache+Mysql+PHP
查看>>
JDBC二查询(web基础学习笔记八)
查看>>
监听器(web基础学习笔记二十二)
查看>>
802.11 学习笔记
查看>>
Leetcode-Database-176-Second Highest Salary-Easy(转)
查看>>
Ubuntu12.04LTS安装好后是空白桌面的解决步骤(更新显卡驱动)
查看>>
poj-3696 The Luckiest number
查看>>
[Dynamic Language] Python定时任务框架
查看>>
Furure的简单介绍和使用
查看>>
CSS3 网格布局(grid layout)基础知识 - 隐式网格自己主动布局(grid-auto-rows/grid-auto-columns/grid-auto-flow)...
查看>>
构建Docker Compose服务堆栈
查看>>
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
CentOS7下zip解压和unzip压缩文件
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>
如何基于Redis Replication设计并实现Redis-replicator?
查看>>