采用网络服务提供词库的模型:
server端:
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <thread>
#pragma comment(lib,"ws2_32.lib")
typedef unsigned short byte2;
void work(SOCKET tcp);
int main()
{
//打开词库文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("文件打开失败,请检查文件是否存在和可读性!\n");
system("pause");
return 0;
}
WSADATA vs;
WSAStartup(MAKEWORD(2, 2), &vs);
SOCKET tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN net;
net.sin_family = AF_INET;
net.sin_addr.S_un.S_addr = INADDR_ANY;
net.sin_port = htons(4800);
if (bind(tcp, (SOCKADDR*)&net, sizeof(net)) == SOCKET_ERROR)
{
printf("网络初始化失败\n");
system("pause");
exit(0);
}
if (listen(tcp, 5) == SOCKET_ERROR)
{
printf("监听端口失败\n");
system("pause");
exit(0);
}
SOCKADDR_IN tmp;
int j = 16;
printf("启动完成,等待用户连接:\n");
while (1)
{
SOCKET user = accept(tcp, (SOCKADDR*)&tmp, &j);
if (user <= 0) continue;
std::thread t1(work, user);
printf("%s连接成功\n", inet_ntoa(tmp.sin_addr));
t1.detach();
}
fclose(pf);
pf = NULL;
closesocket(tcp);
WSACleanup();
return 0;
}
void work(SOCKET tcp)
{
while (true)
{
char recv_data[20] = { 0 };
int ret = recv(tcp, recv_data, 20, 0);
if (ret > 0)
{
//打开词库文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
closesocket(tcp);
return;
}
//获取文件单词总行数
byte2 n = 0;
char ch;
while (!feof(pf))
{
ch = fgetc(pf);
if (ch == '\n')
n++;
}
//随机数(用于读取随机行数)
srand((unsigned int)time(NULL));
byte2 ret1 = rand() % n + 1;
//重置文件光标位置
rewind(pf);
//创建临时储存空间储存从文件读取到的内容
char data[200] = { 0 };
//无效数据读取,让光标移动到随机行
byte2 j = 0;
for (; j < ret1; j++)
{
fgets(data, 200, pf);
}
//清空数组,读取随机行数据
memset(data, 0, 200);
fgets(data, 200, pf);
//将内容发送到客户端
send(tcp, data, 200, 0);
fclose(pf);
pf = NULL;
}
else
{
closesocket(tcp);
return;
}
}
}
客户端:
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
typedef unsigned short byte2;
int main()
{
WSADATA vs;
WSAStartup(MAKEWORD(2, 2), &vs);
SOCKET tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN net;
net.sin_family = AF_INET;
net.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
/*net.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");*/
net.sin_port = htons(4800);
if (connect(tcp, (SOCKADDR*)&net, sizeof(net)) == SOCKET_ERROR)
{
printf("连接服务器失败\n");
system("pause");
exit(0);
}
printf("连接服务器成功\n");
//正确回答计数
byte2 num = 0;
//设置参数
byte2 m = 0;
printf("单词数量(1-65535):");
scanf("%d", &m);
for (byte2 i = 1; i <= m; i++)
{
//创建临时储存空间储存从文件读取到的内容
char data[200] = { 0 };
send(tcp, "0000000000", 20, 0);
int ret = recv(tcp, data, 200, 0);
if (ret > 0)
{
int j = 0;
//找到空格位置
for (j = 0; j < 200; j++)
{
if (data[j] == ' ')
{
data[j] = '\0';
break;
}
}
//删除单词内的换行
for (byte2 i = ++j; i < 200; i++)
{
if (data[i] == '\n')
{
data[i] = '\0';
break;
}
}
//输入单词
printf("\n第%d题 %s:", i, data);
char imput[200] = { 0 };
scanf("%s", imput);
//比较输入的单词与文件读取的单词
if (strcmp(imput, &data[j]) == 0)
{
printf("回答正确, √\n\n");
num++;
}
else
{
printf("错误,正确答案:%s ×\n\n", &data[j]);
}
}
}
//打印成绩
printf("\n\n******************您总共对了%d题******************\n", num);
closesocket(tcp);
system("pause");
WSACleanup();
exit(0);
}
test.txt文本格式:每行一个中文与对应的英文,中间以空格隔开,最多可以添加65536个单词,当然,需要更多的可以修改数据类型。
注:可能有些是错的,本人英文不咋地,不过重点不是这个,哈哈!