Hi everyone ! I'm trying to make a console chat application but I have a problem. I tried the program with someone and that person managed to receive the "Connected !" message, but I didn't. We both use Linksys routers and have set the proper parameters to connect to each other. I gave him the correct IP and I'm using the port #1234 for my program. Finally, we both are using Windows XP. Using the following code, why don't I (the listener) receive the "Connected !" message ?
Code:
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#define DEFAULT_PORT 1234
#define BUFFER_SIZE 255
#define PEER_DISCONNECTED 0
SOCKET ConnectionSocket = 0;
bool Connected = false;
// This function can only be used on recv() and send().
inline bool Success(int ret_value)
{
return !((ret_value == SOCKET_ERROR) || (ret_value == PEER_DISCONNECTED));
}
DWORD WINAPI ListeningProc(LPVOID params)
{
sockaddr_in sin;
ZeroMemory(&sin, sizeof(sin));
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(DEFAULT_PORT);
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(s != INVALID_SOCKET)
{
if(bind(s, (sockaddr*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
listen(s, 10);
int buf = 0;
ConnectionSocket = accept(s, (sockaddr*)&sin, &buf);
if(ConnectionSocket != INVALID_SOCKET)
{
std::cout << "Connected !";
Connected = true;
}
}
}
return 0;
}
DWORD WINAPI ReceivingProc(LPVOID params)
{
char Buffer[BUFFER_SIZE];
unsigned int ByteNb = 0;
unsigned int Temp = 0;
while(Connected == true)
{
// Receive the number of bytes and then receive the message itself.
if(Success(recv(ConnectionSocket, (char*)&Buffer, BUFFER_SIZE, 0)))
{
if(strcmp(Buffer, "") == 0)
{
break;
}
ByteNb = atoi(Buffer) * sizeof(char);
std::cout << "\nAway: ";
while(ByteNb > 0)
{
ZeroMemory(Buffer, sizeof(Buffer));
Temp = recv(ConnectionSocket, (char*)&Buffer, BUFFER_SIZE, 0);
if(Success(Temp))
{
std::cout << Buffer;
ByteNb -= Temp;
}
else if(Temp == PEER_DISCONNECTED)
{
Connected = false;
std::cout << "Peer disconnected...";
break;
}
std::cout << std::endl;
}
}
}
return 0;
}
int main()
{
std::cout << "Win32 console chat application\n"
"[localhost] to connect to yourself.\n"
"[quit] to quit at any time.\n\n";
WSADATA WsaData;
if(WSAStartup(MAKEWORD(2,2), &WsaData) != SOCKET_ERROR)
{
HANDLE ListeningThread = CreateThread(0, 0, ListeningProc, 0, 0, 0);
unsigned long IP = 0;
std::string DistantIP = "";
while(Connected == false)
{
std::cout << "Please enter distant computer's IP: ";
std::getline(std::cin, DistantIP);
if(DistantIP == "[quit]")
{
TerminateThread(ListeningThread, 0);
break;
}
IP = inet_addr((DistantIP == "[localhost]") ? "127.0.0.1" : DistantIP.c_str());
if(IP != INADDR_NONE )
{
sockaddr_in sin;
ZeroMemory(&sin, sizeof(sin));
sin.sin_addr.s_addr = IP;
sin.sin_family = AF_INET;
sin.sin_port = htons(DEFAULT_PORT);
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(connect(s, (sockaddr*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
std::cout << "Connected !";
Connected = true;
ConnectionSocket = s;
closesocket(s);
TerminateThread(ListeningThread, 0);
}
else
{
std::cout << "Failed to connect..." << std::endl;
}
}
}
if(Connected == true)
{
std::string Message;
while(Connected == true)
{
break;
}
closesocket(ConnectionSocket);
}
WSACleanup();
}
std::cout << "Adios amigos";
std::cin.get();
return 0;
}