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

server

描述

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

server 代码

```
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERV_PORT 6666
int 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 <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666 int 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

如图

存在问题

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

Linux单用户CS模型TCP通讯完全注释手册的更多相关文章

  1. linux单用户模式

    linux单用户模式 2014年11月11日 17:18 在grub上相应要启动的内核上按“e”. 进入下一界面,继续按“e”. 在进入文本界面后,输入“single”回车. 进入grub界面后,按“ ...

  2. linux单用户模式修改密码

    Linux使用版本: Centos 7 救援模式: 1,在虚拟机设置里查看光驱是否开启启动,要保证设置状态里的两个选项都已选择. 2,先将Centos系统关机,然后在VMware左侧选中这台虚拟机并右 ...

  3. Linux单用户模式(修改密码、运行级别)方法详解

    很多新手当面对"忘记 root 账户密码导致无法登陆系统"这个问题时,直接选择重新系统.其实大可不必,我只需要进入 emergency mode(单用户模式)更新 root 账户的 ...

  4. Linux 单用户模式的使用

    在进入系统启动菜单时,选择kernel,输入"e"后进入,在kernel开头的启动项后输入(空格) /single或者 / 1,然后输入"b"重新启动机器,此时 ...

  5. 进入Linux单用户模式

    1.       在启动系统出现如下画面时按Enter键进入系统设置页面: 2.       系统设置页面: 3.       按下e键进入: 4.       选择第二项,按e键进入 5.      ...

  6. linux单用户模式修改密码与系统启动级别

    目录 一:系统启动级别 二:单用户模式修改密码 一:系统启动级别 系统启动级别: 0 关机 1 单用户模式(无法通过xshell方式使用)(虚拟机操作)(系统云服务商后台) 2 多用户无网络模式 3 ...

  7. Linux系统网络编程中TCP通讯socket--send导致进程被关闭

    https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...

  8. linux 单用户密码修改

    1.启动系统,并在GRUB2启动屏显时,按下e键进入编辑模式. 2.在linux16/inux/linuxef所在参数行ro更改为init=/sysroot/bin/sh 3.按Crl+x启动到she ...

  9. Linux进入单用户模式

    有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...

随机推荐

  1. MySQL Database on Azure服务在中国正式商用

    基于由世纪互联运营的Windows Azure平台,MySQL Database on Azure服务助力中国用户实现数据库在云端的快速部署.推进用户的创新开发 2015年9月10日,北京——微软中国 ...

  2. FTP自动上传

    注:该脚本上传的压缩文件,通过文件资源管理器拿下来后会提示压缩文件损坏.使用 ftp -s:d:\audit_log\ftp_upload.txt 方法可行(http://www.cnblogs.co ...

  3. TMG 2010 使用脚本来导入URL集和域名集

    作为一个网管,相信有领导叫你限制员工上网的情况,例如只限制员工访问某些网站.在禁止的网站数量少的时候,添加URL集或者域名集是一件很简单的事情,如果禁止的网站数量多达1500个呢?如果再使用ISA S ...

  4. 使用LR的socket协议进行进行性能测试,转解决方案

    在用LR对公司delphi开发的C/S程序进行测试时,发现只有选择socket协议可以录制代码,经研究是通过TCP/IP的方式将参数保存在buffer中发送的方式来完成操作,但由于将buffer内容参 ...

  5. 列表:List<T>与HashSet和只读集合

    一.概述 List<T> 是ArrayList类的等效泛型类.属System.Collections.Generic命名空间. 二.声明及初始化 1.List<T> mList ...

  6. Foj 2296 Alice and Bob(博弈、搜索)

    Foj 2296 Alice and Bob 题意 两个人博弈,规则如下:轮流取0~9中的数字,最后Alice所得的数字个数为1~n中,数位在Alice所取集合中出现奇数次的. 双方想获得尽量多,问A ...

  7. 粒子群优化算法PSO及matlab实现

    算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...

  8. Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用

    @Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...

  9. 【51nod 1514】 美妙的序列

    题目 我们发现我们得正难则反 还是设\(f_i\)表示长度为\(i\)的序列个数 考虑容斥 \[f_i=i!-\sum_{j=1}^{i-1}f_j(i-j)!\] \(i!\)显然是总方案数,我们减 ...

  10. virtualbox+vagrant学习-4-Vagrantfile-7-WinRM Settings

    WinRM Settings 配置命名空间config.winrm config.winrm配置与如何通过winrm配置vagrant访问你的Windows客户相关.与大多数vagrant设置一样,默 ...