network programming-简单的TCP客户服务器编程
簡單的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客户服务器编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信开发同步微信服务器图片到本地,逻辑处
- 下一篇: 18寒假最后一测+dijistra模板