# server
```
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <sstream>
#define BraodcastPort1 9876
#define BraodcastPort2 9875
#define MAXLINE 1024
using namespace std;
void *ThreadMain(void *arg);
struct ThreadArgs
{
int clntSock1;
int clntSock2;
};
//void broadcast(struct sockaddr_in client);
SOCKET serv_sd;
int cli1_len,cli2_len, n,i=1;
char str[MAXLINE];
struct sockaddr_in serv, cli1, cli2;
int main(int argc, char *argv[])
{
struct ThreadArgs *threadArgs;
DWORD threadID;
int servSock;
int clntSock1, clntSock2;
WSADATA wsaData;
struct sockaddr_in echoServAddr;
struct sockaddr_in echoClntAddr;
int clntLen;
if (WSAStartup(0x101, &wsaData) != 0)
{
printf("WSAStartup() failed");
exit(1);
}
serv_sd=socket(AF_INET, SOCK_DGRAM, 0);// 開啟 UDP socket
BOOL broadcast = TRUE;
setsockopt(serv_sd, SOL_SOCKET, SO_BROADCAST, ( const char* )&broadcast, sizeof(broadcast)); // 打開廣播功能
cli1_len = sizeof(cli1);
//printf("server start broadcasting on port:%d\n",BraodcastPort1);
cli1.sin_family = AF_INET;
cli1.sin_addr.s_addr = inet_addr("255.255.255.255");
cli1.sin_port = htons(BraodcastPort1);
cli2_len = sizeof(cli2);
//printf("server start broadcasting on port:%d\n",BraodcastPort2);
cli2.sin_family = AF_INET;
cli2.sin_addr.s_addr = inet_addr("255.255.255.255");
cli2.sin_port = htons(BraodcastPort2);
if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
printf("socket() failed");
memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(5679);
if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
printf("bind() failed");
if (listen(servSock, 3) < 0)
printf("listen() failed");
printf("Server is waiting for clients.\n");
for (;;)
{
clntLen = sizeof(echoClntAddr);
if ((clntSock1 = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)
printf("accept() failed");
if ((clntSock2 = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)
printf("accept() failed");
threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs));
threadArgs -> clntSock1 = clntSock1;
threadArgs -> clntSock2 = clntSock2;
printf("here\n");
if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadMain, threadArgs, 0, (LPDWORD) &threadID) == NULL)
printf("thread_create() failed");
printf("New chat-room with thread ID: %ld and sockets: %d and %d\n", threadID, clntSock1, clntSock2);
}
closesocket(serv_sd);
WSACleanup();
}
void *ThreadMain(void *threadArgs)
{
bool newgame=0, newgame1=0, newgame2=0, quit1=0, quit2=0;
int ans[10];
char answer[5]="";
char winmsg1[6]="play1", winmsg2[6]="play2";
char newg[9]="new game";
int win=0;
int clntSock1, clntSock2;
clntSock1 = ((struct ThreadArgs *) threadArgs) -> clntSock1;
clntSock2 = ((struct ThreadArgs *) threadArgs) -> clntSock2;
char echoBuffer[1000];
int recvMsgSize;
u_long iMode = 1;
ioctlsocket(clntSock1, FIONBIO, &iMode);
ioctlsocket(clntSock2, FIONBIO, &iMode);
int nError;
int tmp, p;
for (int x = 0; x < 10; x++)
{
ans[x] = x;
}
for (int x = 0 ; x < 4 ; ++x )
{
p = rand() % 10 ;
if ( p == x )
continue ;
tmp = ans[x] ;
ans[x] = ans[p] ;
ans[p] = tmp ;
}
for(int j=0; j<4; j++)
{
answer[j]=ans[j]+'0';
}
while (1)
{
if ((recvMsgSize = recv(clntSock1, echoBuffer, 1000, 0)) > 0)
{
printf("1:%s\n",echoBuffer); /*client1 send "new game" or "win"*/
for(int p=0; p<8; p++)
{
if(echoBuffer[p]==newg[p])
{
if(p==7)
{
newgame1=1;
//sendto(serv_sd, answer, strlen(answer), 0,(LPSOCKADDR)&cli1,cli1_len);
//printf("send to 1\n");
}
}
else
{
//printf("1 win\n");
win=1;
break;
}
}
}
nError = WSAGetLastError();
if(nError!=WSAEWOULDBLOCK && nError!=0)
{
printf("Player1 disconnected! error code:%d\n", nError);
break;
}
if ((recvMsgSize = recv(clntSock2, echoBuffer, 1000, 0)) > 0)
{
printf("2:%s\n",echoBuffer);
for(int p=0; p<8; p++)
{
if(echoBuffer[p]==newg[p])
{
if(p==7)
{
newgame2=1;
//sendto(serv_sd, answer, strlen(answer), 0,(LPSOCKADDR)&cli2,cli2_len);
//printf("send to 2");
}
}
else if(echoBuffer[p]=='2')
{
//printf("2 win\n");
win=2;
break;
}
}
}
nError = WSAGetLastError();
if(nError!=WSAEWOULDBLOCK && nError!=0)
{
printf("Player2 disconnected! error code:%d\n", nError);
break;
}
if(newgame1==1&&newgame2==1)
{
for (int x = 0 ; x < 4 ; ++x )
{
p = rand() % 10 ;
if ( p == x )
continue ;
tmp = ans[x] ;
ans[x] = ans[p] ;
ans[p] = tmp ;
}
for(int j=0; j<4; j++)
{
answer[j]=ans[j]+'0';
}
sendto(serv_sd, answer, strlen(answer), 0,(LPSOCKADDR)&cli1,cli1_len);
sendto(serv_sd, answer, strlen(answer), 0,(LPSOCKADDR)&cli2,cli2_len);
printf("answer:%s\n",answer);
newgame1=0;
newgame2=0;
}
else if(win==1)
{
send(clntSock2, winmsg1, strlen(echoBuffer)+1, 0);
win=0;
}
else if(win==2)
{
send(clntSock1, winmsg2, strlen(echoBuffer)+1, 0);
win=0;
}
}
closesocket(clntSock1);
closesocket(clntSock2);
free(threadArgs);
return (NULL);
}
```
# client 1
```
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <iostream>
#include <windows.h>
#define BraodcastPort 9876
#define MAXLINE 1024
void *ThreadMain(void *arg);
struct ThreadArgs
{
SOCKET sd;
};
bool newgame=1; //someone win
bool lose=0;
void SetColor(int color = 7)
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,color);
}
int main(int argc, char** argv)
{
system("mode con cols=80 lines=30 ");
SOCKET sd_b;
struct sockaddr_in serv_b,cli_b;
int serv_len;
char ans[1024]="";
SOCKET sd;
struct sockaddr_in serv;
char str[1024]="\0";
WSADATA wsadata;
DWORD threadID;
struct ThreadArgs *threadArgs;
int n;
char ng[9]="new game";
int countA=0;
int countB=0;
char win[7]="1 win";
char wait[5]="wait";
bool quit=0;
WSAStartup(0x101,(LPWSADATA) &wsadata);
sd_b=socket(AF_INET, SOCK_DGRAM, 0);
BOOL broadcast = TRUE;
if( setsockopt(sd_b, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast))<0)
printf("setsockopt() error!\n");
cli_b.sin_family = AF_INET;
cli_b.sin_addr.s_addr = 0;
cli_b.sin_port = htons(BraodcastPort);
if( bind(sd_b, (LPSOCKADDR) &cli_b, sizeof(cli_b)) <0 )
{
printf("bind error!\n");
system("pause");
return 0;
}
serv_len=sizeof(serv_b);
sd=socket(AF_INET, SOCK_STREAM, 0);
threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs));
threadArgs -> sd = sd;
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
serv.sin_port = htons(5679);
connect(sd, (LPSOCKADDR) &serv, sizeof(serv));
if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadMain, threadArgs, 0, (LPDWORD) &threadID) == NULL)
printf("CreateThread() failed");
printf(" ? ?????????????? n");
printf(" ?? ? n");
printf(" ?? 1 A 2 B ? n");
printf(" ?? ? n");
printf(" ? ?????????????? n");
system("pause");
while(1)
{
SetColor(15);
if(newgame==1)
{
system("cls");
printf("Input \"new game\" or \"quit\": ");
gets(str);
lose=0;
}
else
{
printf("Your guess: ");
gets(str);
}
if(newgame==1&&lose==0)
{
for(int p=0; p<8; p++)
{
if(str[p] == ng[p])
{
if(p==7)
{
n = send(sd, str, strlen(str)+1, 0);
if (n < 0)
{
printf("send error!");
//break;
}
system("cls");
printf("wait.");
n=recvfrom(sd_b, ans, MAXLINE, 0,(LPSOCKADDR) &serv_b,&serv_len );
if(n<=0)
{
printf("receive error\n");
}
//printf("%s\n",ans);
//printf("client(from:%s):%s\n",inet_ntoa(serv_b.sin_addr),ans);
newgame=0;
system("cls");
}
}
else if(str[0]=='q'&&str[1]=='u'&&str[2]=='i'&&str[3]=='t'&&lose==0)
{
printf("Bye~\n");
quit=1;
system("pause");
break;
}
else if(lose==0)
{
printf("Wrong input!\nInput \"new game\"!\n");
system("pause");
break;
}
}
}
else if(lose==0)
{
if(str[0]==str[1]||str[0]==str[2]||str[0]==str[3]
||str[1]==str[2]||str[1]==str[3]||str[2]==str[3])
{
printf("Numbers cannot be repeated.\n");
}
else
{
for(int t=0; t<4; t++)
{
for(int r=0; r<4; r++)
{
if(ans[t]==str[r])
{
if(t==r)
countA++;
else
countB++;
}
}
}
if(countA==4)
{
system("cls");
SetColor(175);
printf("WIN~\n");
SetColor(15);
newgame=1;
n = send(sd, win, strlen(win), 0);
if (n < 0)
{
printf("send error!");
//break;
}
system("pause");
}
else
{
printf("%dA%dB\n", countA, countB);
}
countA=0;
countB=0;
}
}
if(quit==1)
{
break;
}
}
closesocket(sd_b);
WSACleanup();
}
void *ThreadMain(void *threadArgs)
{
SOCKET sd;
char str[MAXLINE];
int n;
char winmsg[10]="";
sd = ((struct ThreadArgs *) threadArgs) -> sd;
while(1)
{
n = recv(sd, winmsg, MAXLINE, 0);
if(n<=0)
break;
system("cls");
//printf("recv: %s\n", str);
SetColor(207);
printf("Lose\n");
newgame=1;
lose=1;
SetColor(15);
system("pause");
//gets(str);
}
closesocket(sd);
WSACleanup();
return NULL;
}
```
# client 2
```
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <iostream>
#include <windows.h>
#define BraodcastPort 9875
#define MAXLINE 1024
void *ThreadMain(void *arg);
struct ThreadArgs
{
SOCKET sd;
};
bool newgame=1; //someone win
bool lose=0;
void SetColor(int color = 7)
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,color);
}
int main(int argc, char** argv)
{
system("mode con cols=80 lines=30 ");
SOCKET sd_b;
struct sockaddr_in serv_b,cli_b;
int serv_len;
char ans[1024]="";
SOCKET sd;
struct sockaddr_in serv;
char str[1024]="\0";
WSADATA wsadata;
DWORD threadID;
struct ThreadArgs *threadArgs;
int n;
char ng[9]="new game";
int countA=0;
int countB=0;
char win[7]="2 win";
char wait[5]="wait";
bool quit=0;
WSAStartup(0x101,(LPWSADATA) &wsadata);
sd_b=socket(AF_INET, SOCK_DGRAM, 0);
BOOL broadcast = TRUE;
if( setsockopt(sd_b, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast))<0)
printf("setsockopt() error!\n");
cli_b.sin_family = AF_INET;
cli_b.sin_addr.s_addr = 0;
cli_b.sin_port = htons(BraodcastPort);
if( bind(sd_b, (LPSOCKADDR) &cli_b, sizeof(cli_b)) <0 )
{
printf("bind error!\n");
system("pause");
return 0;
}
serv_len=sizeof(serv_b);
sd=socket(AF_INET, SOCK_STREAM, 0);
threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs));
threadArgs -> sd = sd;
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
serv.sin_port = htons(5679);
connect(sd, (LPSOCKADDR) &serv, sizeof(serv));
if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadMain, threadArgs, 0, (LPDWORD) &threadID) == NULL)
printf("CreateThread() failed");
printf(" ? ?????????????? n");
printf(" ?? ? n");
printf(" ?? 1 A 2 B ? n");
printf(" ?? ? n");
printf(" ? ?????????????? n");
system("pause");
while(1)
{
SetColor(15);
if(newgame==1)
{
system("cls");
printf("Input \"new game\" or \"quit\": ");
gets(str);
lose=0;
}
else
{
printf("Your guess: ");
gets(str);
}
if(newgame==1&&lose==0)
{
for(int p=0; p<8; p++)
{
if(str[p] == ng[p])
{
if(p==7)
{
n = send(sd, str, strlen(str)+1, 0);
if (n < 0)
{
printf("send error!");
//break;
}
system("cls");
printf("wait.");
n=recvfrom(sd_b, ans, MAXLINE, 0,(LPSOCKADDR) &serv_b,&serv_len );
if(n<=0)
{
printf("receive error\n");
}
printf("%s\n",ans);
//printf("client(from:%s):%s\n",inet_ntoa(serv_b.sin_addr),ans);
newgame=0;
system("cls");
}
}
else if(str[0]=='q'&&str[1]=='u'&&str[2]=='i'&&str[3]=='t'&&lose==0)
{
printf("Bye~\n");
quit=1;
system("pause");
break;
}
else if(lose==0)
{
printf("Wrong input!\nInput \"new game\"!\n");
system("pause");
break;
}
}
}
else if(lose==0)
{
if(str[0]==str[1]||str[0]==str[2]||str[0]==str[3]
||str[1]==str[2]||str[1]==str[3]||str[2]==str[3])
{
printf("Numbers cannot be repeated.\n");
}
else
{
for(int t=0; t<4; t++)
{
for(int r=0; r<4; r++)
{
if(ans[t]==str[r])
{
if(t==r)
countA++;
else
countB++;
}
}
}
if(countA==4)
{
system("cls");
SetColor(175);
printf("WIN~\n");
SetColor(15);
newgame=1;
n = send(sd, win, strlen(win), 0);
if (n < 0)
{
printf("send error!");
//break;
}
system("pause");
}
else
{
printf("%dA%dB\n", countA, countB);
}
countA=0;
countB=0;
}
}
if(quit==1)
{
break;
}
}
closesocket(sd_b);
WSACleanup();
}
void *ThreadMain(void *threadArgs)
{
SOCKET sd;
char str[MAXLINE];
int n;
char winmsg[10]="";
sd = ((struct ThreadArgs *) threadArgs) -> sd;
while(1)
{
n = recv(sd, winmsg, MAXLINE, 0);
if(n<=0)
break;
system("cls");
//printf("recv: %s\n", str);
SetColor(207);
printf("Lose\n");
newgame=1;
lose=1;
SetColor(15);
system("pause");
//gets(str);
}
closesocket(sd);
WSACleanup();
return NULL;
}
```