日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

network programming-简单的TCP客户服务器编程

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 network programming-简单的TCP客户服务器编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡單的TCP(Transport Control Pr)程序客戶端流程:創(chuàng)建套接字(套接字用IP地址:端口號)表示)socket()->請求連接connect()->交換數(shù)據(jù) send()/recv()->關(guān)閉連接 closesocket()

簡單的TCP程序服務(wù)端流程:創(chuàng)建套接字socket()->綁定相應(yīng)的端口bind()->監(jiān)聽端口listen()->接受連接accept()->交換數(shù)據(jù)recv()/send()->關(guān)閉連接 closesocket()

第一個網(wǎng)絡(luò)程序

代碼實現(xiàn):

TcpServer.cpp

TcpClient.cpp

在其基礎(chǔ)上,更進(jìn)一步,實現(xiàn)一個基于簡單TCP的用戶注冊程序,實現(xiàn)下列功能

客戶端發(fā)送用戶注冊信息(用戶名、密碼和其他資料)到服務(wù)器端; 服務(wù)器端首先檢查用戶注冊數(shù)據(jù)是否符合格式。如不符合則返回“非法訪問”提示; 如符合檢查用戶文件中是否存在相同用戶名,如不存在,則將用戶注冊信息存放到用戶文件中,返回“用戶注冊成功”提示 如用戶文件中存在相同用戶名,則返回“用戶名已被注冊”。

主要的實現(xiàn)函數(shù):

//將用戶鍵入的數(shù)據(jù)放到User結(jié)構(gòu)體中
User Input_Info(const char* message);

//判斷用戶鍵入的全部數(shù)據(jù)的是否符合格式
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);

//主要的驗證函數(shù)
void Main_Process_Info(const User user,const SOCKET sNewConnection);

//判斷該用戶名是否已經(jīng)被注冊(也就是說該用戶名有沒有存在于用戶文件中)
int Is_Name_Exist(const char* name);

//將新的用戶信息寫入到文件中
int Write_Info_To_Txt(const User user);

/****每個函數(shù)的具體代碼***/


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位,接著判斷是不是全部是數(shù)字
{
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)
{
//打開用戶文件,將該用戶名和文件中的用戶名一個個比較,
//看看是否已經(jīng)有相同的用戶名存在了
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];/*緩沖區(qū)*/
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;//會出現(xiàn)停止工作的情況
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))//如果用戶注冊數(shù)據(jù)符合格式
{
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, "該用戶名已經(jīng)被注冊了!\n");
send(sNewConnection, msg, sizeof(msg), 0);
printf("該用戶名已經(jīng)被注冊了!\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;
}

運行結(jié)果截屏如下:

客戶端:

?

服務(wù)端:

?

?

用戶信息文件:

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/BlueBlue-Sky/p/8495505.html

總結(jié)

以上是生活随笔為你收集整理的network programming-简单的TCP客户服务器编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。