Original Post
Hi guys, I have finally figured out the problem in the strange server thread and now everything works correctly. However - i would like to add in a UDP socket so that a client could broadcast to find it. I know how to set up a UDP socket with SOCK_DGRAM and all that but i was wondering how i would implement it within my code. Basically i just want it there listening so if a client sends a packet it responds to it with the IP address and Port number of the server so a TCP connection can be generated. Heres the code below.
#include <winsock2.h>
#include <iostream>
using namespace std;
struct ClientEntry
{
int socket_Number; // Socket Number for TCP inbound connection
sockaddr_in Sender; // Details of socket
} ;
#define MAX_CLIENTS 5
ClientEntry ClientEntryList[MAX_CLIENTS];
void SendServerMessage(char *message, ClientEntry from)
{
char completeMessage[512];
int m;
sprintf(completeMessage, "[%s:%1d]: %s", inet_ntoa(from.Sender.sin_addr), ntohs(from.Sender.sin_port), message);
for (m=0; m<MAX_CLIENTS; m++) // Send it to all other clients
if (ClientEntryList[m].socket_Number!=-1)
{
send(ClientEntryList[m].socket_Number, completeMessage, strlen(completeMessage), 0);
}
}
int main()
{
WSAData Wsadata;
int l;
int size;
int error;
int MaxSocketNumber = -1;
int Senderlen;
int Temp;
SOCKET serverTCP;
SOCKET Client;
sockaddr_in Server;
sockaddr_in Sender;
fd_set socketSet;
char message[256];
WSAStartup(MAKEWORD(2,2), &Wsadata);
serverTCP = socket(AF_INET, SOCK_STREAM, 0);
if (serverTCP==INVALID_SOCKET)
{
printf("Socket Creation Failed");
return 0;
}
else
{
cout<<"Socket Created \n";
}
Server.sin_family=AF_INET;
Server.sin_addr.s_addr=INADDR_ANY;
Server.sin_port=htons(2222);
Temp = bind(serverTCP, (sockaddr *) &Server, sizeof(Server));
if(Temp == SOCKET_ERROR)
{
Temp = WSAGetLastError();
printf("Binding Failed");
WSACleanup();
return 0;
}
else
{
cout<<"Socket Bound \n";
}
listen(serverTCP, SOMAXCONN);
if(Temp == SOCKET_ERROR)
{
Temp = WSAGetLastError();
printf("Binding Failed");
WSACleanup();
return 0;
}
else
{
cout<<"Socket Listening \n";
}
for (l=0; l<MAX_CLIENTS; l++)
{
ClientEntryList[l].socket_Number = -1;
}
while (true)// continuous loop for the body of the server
{
FD_ZERO(&socketSet); // Empty the read set
FD_SET(serverTCP, &socketSet); // Add the Listening Socket
MaxSocketNumber = serverTCP;
for (l=0; l<MAX_CLIENTS; l++)
{
if (ClientEntryList[l].socket_Number!=-1)
{
FD_SET(ClientEntryList[l].socket_Number, &socketSet); // add the client to the set of read sockets
if (ClientEntryList[l].socket_Number>MaxSocketNumber)
{
MaxSocketNumber = ClientEntryList[l].socket_Number;//update the max socket number
}
}
}
error = select(MaxSocketNumber+1, &socketSet, 0, 0, 0);// Wait until something happens on any of the connected sockets
if (error<0)
{
perror("select"); // Error with Select call itself
break;
}
if (FD_ISSET(serverTCP, &socketSet))//a new connection is waiting
{
Senderlen = sizeof(Sender);
Client = accept(serverTCP, (sockaddr *)&Sender, &Senderlen);
printf("New Client IP Address %s Port %1d\n", inet_ntoa(Sender.sin_addr), ntohs(Sender.sin_port));
for (l=0; l<MAX_CLIENTS; l++)
{
if (ClientEntryList[l].socket_Number==-1)
{
ClientEntryList[l].socket_Number = Client;
memcpy(&ClientEntryList[l].Sender, &Sender,
sizeof(Sender));
break;
}
if (l==MAX_CLIENTS)// Do this if no free client spaces
{
strcpy(message, "There are currently no available slots - Please Try Later\n");
send(Client, message, strlen(message), 0);
closesocket(Client);
}
}
continue; // Restart While Loop
}
for (l=0; l<MAX_CLIENTS; l++)
{
if (ClientEntryList[l].socket_Number!=-1)
{
if (FD_ISSET(ClientEntryList[l].socket_Number, &socketSet)) // This client!
{
size = recv(ClientEntryList[l].socket_Number, message, 255, 0);
if (size>0)
{ // A message!
message[size] = 0;
// Display sender and message
printf("[%s] sends: %s\n", inet_ntoa(ClientEntryList[l].Sender.sin_addr), message);
SendServerMessage(message, ClientEntryList[l]); // Send to all clients
}
else
{
ClientEntryList[l].socket_Number = -1; // Client exception error
printf("Client %s has left\n", inet_ntoa(ClientEntryList[l].Sender.sin_addr));
SendServerMessage("Client has Left\n", ClientEntryList[l]);
} // i.e. Client has left
}
}
}
}
for (l=0;l<MAX_CLIENTS; l++)
{
if (ClientEntryList[l].socket_Number!=-1)
{
closesocket(ClientEntryList[l].socket_Number);
}
}
closesocket(serverTCP);
WSACleanup();
return 0;
}
[\source]
Is it simply a case of putting a UDP socket in there and letting it do its stuff?
Cheers
Neil