简单的TCP程序客户端流程:创建套接字(套接字用IP地址:端口号)表示)socket()->请求连接connect()->交换数据 send()/recv()->关闭连接 closesocket()

简单的TCP程序服务端流程:创建套接字socket()->绑定相应的端口bind()->监听端口listen()->接受连接accept()->交换数据recv()/send()->关闭连接 closesocket()

第一个网络程序

代码实现:

TcpServer.cpp

TcpClient.cpp

在其基础上,更进一步,实现一个基于简单TCP的用户注册程序,实现下列功能

客户端发送用户注册信息(用户名、密码和其他资料)到服务器端; 服务器端首先检查用户注册数据是否符合格式。如不符合则返回“非法访问”提示; 如符合检查用户文件中是否存在相同用户名,如不存在,则将用户注册信息存放到用户文件中,返回“用户注册成功”提示 如用户文件中存在相同用户名,则返回“用户名已被注册”。

主要的实现函数:

//将用户键入的数据放到User结构体中
User Input_Info(const char* message);

//判断用户键入的全部数据的是否符合格式
int Is_Valid_Format(const User user);

//分别判断用户名、密码、手机号码是否符合格式
int Is_Valid_Format_Of_Name(const char* name);
int Is_Valid_Format_Of_Password(const char* pass);
int Is_Valid_Format_Of_PhoneNumber(const char* phone);

//主要的验证函数
void Main_Process_Info(const User user,const SOCKET sNewConnection);

//判断该用户名是否已经被注册(也就是说该用户名有没有存在于用户文件中)
int Is_Name_Exist(const char* name);

//将新的用户信息写入到文件中
int Write_Info_To_Txt(const User user);

/****每个函数的具体代码***/

User Input_Info(const char* message)
{
User user;
char userName[20] = {0},
password[20] = { 0 }, phoneNumber[20] = {0};
// user = { '\0', '\0', '\0' };
//user.userName = {0};

sscanf(message, "%s\t%s\t%s", user.userName,
user.password, user.phoneNumber);

/*printf("%s\t%s\t%s", user.userName,
user.password, user.phoneNumber);*/
/* sscanf(message, "%s\t%s\t%s", userName,
password, phoneNumber);
printf("%s\t%s\t%s", userName,
password, phoneNumber);*/
return user;
}

int Is_Valid_Format(const User user)
{
int flag = 0;
if (Is_Valid_Format_Of_Name(user.userName)&&
Is_Valid_Format_Of_Password(user.password)&&
Is_Valid_Format_Of_PhoneNumber(user.phoneNumber))
{
return 1;
}
else
{
return 0;
}
}

int Is_Valid_Format_Of_Name(const char* name)
{
if (strlen(name) >= 6 && strlen(name) <= 12)
return 1;
else
return 0;

}
int Is_Valid_Format_Of_Password(const char* pass)
{
if (strlen(pass) >= 8 && strlen(pass) <= 24)
return 1;
else
return 0;
}
int Is_Valid_Format_Of_PhoneNumber(const char* phone)
{
if (strlen(phone)==11)//先判断长度是不是11位,接着判断是不是全部是数字
{
for (int i = 0; i < 11; i++)
{
if (phone[i] >= '0'&&phone[i] <= '9')
{
continue;
}
else
{
break;
return 0;
}

}
return 1;
}
else
{
return 0;
}
}

int Is_Name_Exist(const char* name)
{
//打开用户文件,将该用户名和文件中的用户名一个个比较,
//看看是否已经有相同的用户名存在了
char* file_name = "user.txt";
if (access(file_name, 0))
{
//printf("D://user.txt doesn't exist!");
//printf("then create!");
char* file_name = "user.txt";
FILE *fp = fopen(file_name, "at+");
}
//将文件中的记录一条条的都出来
//假定每一条记录承载每一个用户的全部信息
//第一条字符串是用户的name
char buf[MAX_SIZE];/*缓冲区*/
FILE* fp=NULL;
if ((fp=fopen("user.txt","r"))==NULL)//该文件和.cpp文件放在同一个父目录下
{
printf("Failed to read!");
exit(1);
}
while (fgets(buf,MAX_SIZE,fp)!=NULL)
{
//char* temp_name;//会出现停止工作的情况
char temp_name[256] = { '\0' };
char temp_pass[512] = { '\0' };
char temp_phone[256] = { '\0' };
sscanf(buf, "%s\t%s\t%s", temp_name,temp_pass,temp_phone);
if (strcmp(temp_name,name)==0)//该用户名已被注册,该用户名在文件中存在
{
return 1;
}
else
{
continue;
}
}
return 0;//该用户名未被注册,该用户名不在用户文件中存在

}

void Main_Process_Info(const User user,const SOCKET sNewConnection)
{
char msg[256] = {'\0'};
if (Is_Valid_Format(user))//如果用户注册数据符合格式
{
if (!Is_Name_Exist(user.userName))
{
//将该用户的注册信息写入用户文件中
if (Write_Info_To_Txt(user))
{
strcpy(msg, "用户注册成功!\n");
send(sNewConnection,msg,sizeof(msg),0);
printf("用户注册成功!\n");
}
else
{
strcpy(msg, "用户注册失败!(未能将新用户信息成功写入用户文件中)\n");
send(sNewConnection, msg, sizeof(msg), 0);
printf("用户注册失败!(未能将新用户信息成功写入用户文件中)\n");
}

}
else
{
strcpy(msg, "该用户名已经被注册了!\n");
send(sNewConnection, msg, sizeof(msg), 0);
printf("该用户名已经被注册了!\n");
}
}
else
{
strcpy(msg, "非法访问!\n");
send(sNewConnection, msg, sizeof(msg), 0);
printf("非法访问!\n");
}
}

int Write_Info_To_Txt(const User user)
{
FILE* fp;
char* filename = "user.txt";
if ((fp=fopen(filename,"a"))==NULL)
{
printf("\n 不能打开该用户文件!\n");
return 0;
}
fprintf(fp,"%s\t%s\t%s\n",user.userName,user.password,user.phoneNumber);
printf("%s\t%s\t%s\n", user.userName, user.password, user.phoneNumber);
fclose(fp);
return 1;
}

运行结果截屏如下:

客户端:

服务端:

用户信息文件:

network programming-简单的TCP客户服务器编程的更多相关文章

  1. 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例

    本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...

  2. UNIX网络编程 第5章 TCP客户/服务器程序示例

    UNIX网络编程 第5章 TCP客户/服务器程序示例

  3. 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景

    相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...

  4. 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序

    建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...

  5. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  6. TCP客户/服务器简单Socket程序

    建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...

  7. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  8. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  9. TCP客户/服务器程序实例——回射服务器

    目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编 ...

随机推荐

  1. linux常用命令_1

    linux中命令格式是什么? 命令 [参数选项] [文件或路径] 中括号表示可选,命令的参数与路径文件可选 参数选择表示一个命令的不同功能 命令 和 参数选项 中必有一空格,多个参数连在一起写 几乎所 ...

  2. python_递归_斐波那契

    什么是递归算法? -- 函数自己调用自己本身 -- 本质上return返回的时候,总是把一个参数传入到自己函数本身,让函数反复调用下去 递归有何特点? -- 必有一个结束条件 没有结束条件,递归就没有 ...

  3. 爬取知名社区技术文章_pipelines_4

    获取字段的存储处理和获取普通的路径 #!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import gevent import pym ...

  4. springMVC注解方式+easyUI+MYSQL配置实例

    刚接触springMVC,使用的注解方式,也在学习阶段,所以把自己学习到的记下来.本文利用springMVC从数据库读取用户信息为例,分享一下. 1.准备相关架包及资源.因为使用springMVC+e ...

  5. wer

    概述 快速入门流程: 使用叮当扫码产品请遵循以下操作步骤: 1. 新建项目信息 2. 新建产品信息 3. 添加发货产品 4. 发货 5. 收货 (具体使用操作请查看详细的使用说明) 文档目的: 本文档 ...

  6. Linux 下定时备份数据库以及删除缓存

    一.定时备份数据库 1.在根目录下创建备份文件夹 #mkdir backup 2.进入到该目录下,创建backup.sh文件 3.赋予文件权限让其变成可执行文件 4.在backup.sh中写备份的脚本 ...

  7. Tensorflow ActiveFunction激活函数解析

    Active Function 激活函数 原创文章,请勿转载哦~!! 觉得有用的话,欢迎一起讨论相互学习~Follow Me Tensorflow提供了多种激活函数,在CNN中,人们主要是用tf.nn ...

  8. OpenStreetMap数据清洗(SQL&MonogoDB版本)

    目标:通过网上下载的OpenStreetMap.xml数据格式,将该文件的格式进行统计,清洗,并导出成CSV格式的文件,最后倒入到SQLite中 本案例中所需的包 import csv import ...

  9. Jmeter Smock Test规范设计

    Jmeter Smock Test规范设计 一.Smock Test物料 1.开发运行工具Jmeter,(下载地址: http://jmeter.apache.org/download_jmeter. ...

  10. VUE2.0增删改查附编辑添加model(弹框)组件共用

    Vue实战篇(增删改查附编辑添加model(弹框)组件共用) 前言 最近一直在学习Vue,发现一份crud不错的源码 预览链接 https://taylorchen709.github.io/vue- ...