简单的TCP(Transport Control Pr)程序客户端流程:创建套接字(套接字用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;
}

运行结果截屏如下:

客户端:

服务端:

用户信息文件:

转载于:https://www.cnblogs.com/BlueBlue-Sky/p/8495505.html

network programming-简单的TCP客户服务器编程相关推荐

  1. 客户和服务器之间响应的序列,网络编程-第五讲-TCP客户-服务器程序例子.pdf-原创力文档...

    网络编程 第五讲TCP客户-服务器程序例子 多进程并发服务器基本架构 pid_t pid; int listenfd, connfd; listenfd = Socket( ... ); /* fil ...

  2. Qt4_写TCP客户/服务器应用程序

    写TCP客户/服务器应用程序 QTcpSocket和QTcpServer类可以用来实现TCP客户端和服务器.TCP是一个传输协议,它构成了包括FTP和HTTP等很多应用程序层的因特网协议基础,它也可以 ...

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

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

  4. 基于UDP的socket客户服务器编程

    前面我们写了关于TCP的客户/服务器模式,现在我们写关于UDP的客户/服务器模式. 基于TCP编写的应用程序和基于TCP编写的应用程序之间存在一些本质的差异,其原因在于这两个传输层之间的差别:UDP是 ...

  5. 【UNIX网络编程】| 【03】TCP客户/服务器程序示例

    文章目录 1.概述 2.TCP回射服务器程序 3.TCP回射客户程序 3.正常启动 4.正常终止 5.POSIX信号处理 5.1 signal函数 5.2 POSIX信号语义 6.处理SIGCHID信 ...

  6. unix网络编程各种TCP客户-服务器程序设计实例(三)

    第五种  TCP预先派生子进程服务器程序: 对预先派生子进程服务器的最后一种改动就是由父进程调用accept,然后再将所接受的已连接描述字传递给子进程.父进程必须跟踪子进程的忙闲状态,以便给空闲子进程 ...

  7. 计算机tcpip网络原理与应用,清华大学出版社-图书详情-《TCP/IP网络编程原理与技术》...

    前言 随着Internet的发展,网络技术已经渗透到人们的生活和工作中.TCP/IP已经成为最流行的网络协议,且还在演变以满足未来的需要.在速度越来越快的计算机硬件和不断更新的软件发展的背后,TCP/ ...

  8. linux守护进程中多线程实现,Linux下实现多线程客户/服务器

    在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理. Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子 ...

  9. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?

    我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...

最新文章

  1. iOS SwiftUI篇-1 项目结构
  2. [UE4]C++实现动态加载的问题
  3. [Java] 基本資料包裝類別 Wrapper Classes
  4. DOS特殊字符转义方法
  5. 笨人可以学计算机吗,为什么有的笨人一旦开窍,其人生就像开了挂似的呢?
  6. 【树链剖分】LCA(P4211)
  7. Struts2中数据封装方式
  8. [leedcode][JAVA][365][BFS]
  9. C#获取文件夹下的所有文件名
  10. 微机计算机原理及应用ppt,微型计算机原理及应用PPT课件
  11. 图形评审技术(GERT)与计划评审技术(PERT)
  12. 神经网络编程的34个案例,神经网络编程是什么
  13. 树莓派添加开机自启动
  14. Windows 10 到期时间如何查看
  15. 灰色预测的MATLAB代码
  16. JSP解决:Attempt to clear a buffer that#39;s already been flushed错误(jsp:forward标签跳转空白)...
  17. U盘中毒文件乱码怎么办
  18. cad剖切线的快捷键_Auto CAD2017剖切符号快捷键是什么呢?
  19. mysql 查询本年当前季度数据 ,SQL查询当前季度的数据
  20. IMEI号和MEID号

热门文章

  1. Android 安全提示 笔记
  2. (十五)WebGIS中平移功能的设计和实现
  3. 思科路由器debug基本操作和简单配置
  4. 【转载】Hook钩子C#实例
  5. Sketch小技巧—画出各种星型和多边形的简单方法
  6. Python计算防蓝光眼镜加权阻隔率
  7. Error while retrieving the leader gateway. Retrying to connect to akka.tcp://flink@laptop:xxxx
  8. hadoop的yarn与node中的yarn冲突问题
  9. Opengl :公转与自转
  10. Kettle, Solr