client(玩家A)
#define BUF_SZIE 64
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32")
#include <iostream>
#include <string>
#include <conio.h>
#include <Windows.h>
using namespace std;
char buf_rec[BUF_SZIE];
char buf_send[BUF_SZIE];
DWORD WINAPI funProc(LPVOID lpParameter);
int retVal;
int number;
bool myturn=true;
int result(int m,int num){
int A=0,B=0;//数字对,位置对
char ch1[5],ch2[5];
itoa(m,ch1,10);
itoa(num,ch2,10);
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
if(ch1[i]==ch2[j]){
A++;
if(i==j)
B++;
}
}
}
return 10*A+B;
}
SOCKET sHost;
int main(int argc, char* argv[])
{
HANDLE hThread;
hThread=CreateThread(NULL,0,funProc,NULL,0,NULL);
CloseHandle(hThread);
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return -1;
}
/*创建套接字*/
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sHost)
{
WSACleanup();
return -1;
}
/*设置服务器地址*/
SOCKADDR_IN servAddr;
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr("219.245.81.15");
servAddr.sin_port = htons((short)4999);
int nServAddlen = sizeof(servAddr);
/*连接服务器*/
while(1){
retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
if(retVal==0)
break;
}
if(SOCKET_ERROR == retVal)
{
closesocket(sHost);
WSACleanup();
return -1;
}
/*向服务器发送数据*/
while(cin>>buf_send){
if(*buf_send>'0'&&*buf_send<='9'&&myturn){//如果输入的是数字,且轮到自己
retVal=send(sHost, buf_send, strlen(buf_send), 0);
myturn=false;
char buf[4]={*buf_send,*(buf_send+1),*(buf_send+2),*(buf_send+3)};
if(atoi(buf)==number){//如果猜对了
cout<<"You Win! The number is:"<<number<<endl;
myturn=true;
}
else
cout<<result(atoi(buf),number)<<endl;
}
else if(*buf_send>'0'&&*buf_send<='9'&&!myturn){//是数字,轮不到自己
cout<<"Not your turn!"<<endl;
}
else
retVal=send(sHost, buf_send, strlen(buf_send), 0);
}
closesocket(sHost);
WSACleanup();
getchar();
return 0;
}
DWORD WINAPI funProc(LPVOID lpParameter){
while (1)
{
retVal = recv(sHost, buf_rec, BUF_SZIE, 0);
if(*buf_rec!=0){
if('0'<*buf_rec&&*buf_rec<='9'&&*(buf_rec+4)!='@'){//如果收到数字
myturn=true;
int m=1000*(*(buf_rec)-'0')+100*(*(buf_rec+1)-'0')+10*(*(buf_rec+2)-'0')+*(buf_rec+3)-'0';
if(m==number){
cout<<"You Lose! The number is:"<<m<<endl;
myturn=false;
}
else
cout<<"---->"<<m<<'\t'<<result(m,number)<<endl;
}
else if(*(buf_rec+4)=='@'){
char str[4]={*buf_rec,*(buf_rec+1),*(buf_rec+2),*(buf_rec+3)};
number=atoi(str);
cout<<"Begin:"<<endl;
}
else{
cout<<"dct: ";
char* cp=buf_rec;
while(*cp!=0){
cout<<*cp;
cp++;
}
cout<<endl;
ZeroMemory(buf_rec, BUF_SZIE);
}
}
}
return 0;
}
server(玩家B)
#include <stdio.h>
#define BUF_SIZE 64
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include<conio.h>
#include <Windows.h>
#include<ctime>
using namespace std;
char buf_rec[BUF_SIZE];
char buf_send[BUF_SIZE];
DWORD WINAPI funProc(LPVOID lpParameter);
int retVal;
SOCKET sClient;
int number;
bool myturn=false;
int result(int m,int num){
int A=0,B=0;//数字对,位置对
char ch1[5],ch2[5];
itoa(m,ch1,10);
itoa(num,ch2,10);
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
if(ch1[i]==ch2[j]){
A++;
if(i==j)
B++;
}
}
}
return 10*A+B;
}
int rand_int(){
srand(time(NULL));
int a,b,c,d;
while(1){
a=rand()%10;
if(a!=0)
break;
}
while(1){
b=rand()%10;
if(b!=a)
break;
}
while(1){
c=rand()%10;
if(c!=a&&c!=b)
break;
}
while(1){
d=rand()%10;
if(d!=a&&d!=b&&d!=c)
break;
}
return 1000*a+100*b+10*c+d;
}
int main(int argc, char* argv[])
{
HANDLE hThread;
hThread=CreateThread(NULL,0,funProc,NULL,0,NULL);
CloseHandle(hThread);
/*初始化套结字动态库*/
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
/*创建套接字*/
SOCKET sServer;
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
WSACleanup();
return -1;
}
/*服务器套接字地址*/
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(4999);
addrServ.sin_addr.s_addr = INADDR_ANY;
/*绑定套接字*/
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == retVal)
{
closesocket(sServer);
WSACleanup();
return -1;
}
/*开始监听*/
retVal = listen(sServer, 1);
if(SOCKET_ERROR == retVal)
{
closesocket(sServer);
WSACleanup();
return -1;
}
/*接受客户端请求*/
sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
if(INVALID_SOCKET == sClient)
{
closesocket(sServer);
WSACleanup();
return -1;
}
/*接收客户端数据*/
number=rand_int();
cout<<"Begin:"<<endl;
itoa(number,buf_send,10);
*(buf_send+4)='@';
retVal=send(sClient,buf_send,BUF_SIZE,0);
ZeroMemory(buf_rec, BUF_SIZE);
while (cin>>buf_send){
if(*buf_send>'0'&&*buf_send<='9'&&myturn){//如果输入的是数字,且轮到自己
retVal=send(sClient,buf_send,BUF_SIZE,0);
myturn=false;
char buf[4]={*buf_send,*(buf_send+1),*(buf_send+2),*(buf_send+3)};
if(atoi(buf)==number){
myturn=true;
cout<<"You Win! The number is:"<<number<<endl;
number=rand_int();
cout<<"Begin:"<<endl;
itoa(number,buf_send,10);
*(buf_send+4)='@';
retVal=send(sClient,buf_send,BUF_SIZE,0);
}
else
cout<<result(atoi(buf),number)<<endl;
}
else if(*buf_send>'0'&&*buf_send<='9'&&!myturn)
cout<<"Not your turn!"<<endl;
else
retVal=send(sClient,buf_send,BUF_SIZE,0);
}
/*退出*/
closesocket(sServer);
closesocket(sClient);
WSACleanup();
getchar();
return 0;
}
DWORD WINAPI funProc(LPVOID lpParameter){
while(1){
retVal = recv(sClient, buf_rec, BUF_SIZE, 0);
if(*buf_rec!=0){
if('0'<*buf_rec&&*buf_rec<='9'){//如果收到数字
myturn=true;
int m=1000*((int)*(buf_rec)-'0')+100*((int)*(buf_rec+1)-'0')+10*((int)*(buf_rec+2)-'0')+(int)*(buf_rec+3)-'0';
if(m==number){
cout<<"You Lose! The number is:"<<m<<endl;
myturn=false;
number=rand_int();
cout<<"New Begin:"<<endl;
itoa(number,buf_send,10);
*(buf_send+4)='@';
retVal=send(sClient,buf_send,BUF_SIZE,0);
}
else
cout<<"---->"<<m<<'\t'<<result(m,number)<<endl;
}
else{
cout<<"xct: ";
char* cp=buf_rec;
while(*cp!=0){
cout<<*cp;
cp++;
}
}
cout<<endl;
ZeroMemory(buf_rec, BUF_SIZE);
}
}
return 0;
}