Hello, I am lost on what I am missing to get my networking code working, to allow the server and client to send messages back and forth to each other... Do I need to setup a separate thread for each socket? e.g. one thread server one for client?
Looking to have someone edit what I would need to do to have this loop without having any issues... Right now I have to hit enter on both ends to see the results?
if(s == "exit" || s == "Exit" || s == "EXIT") logged = false;
sf::Packet packet; packet << s; if(socket.send(packet) != sf::Socket::Done) return; std::cout << "Message sent to the client: \"" << s << "\"" << std::endl; } void RecieveMsgTcp(sf::TcpSocket& socket) { std::string s; sf::Packet packet; if(socket.receive(packet) != sf::Socket::Done) return; packet >> s; std::cout << "Answer received from the client: \"" << s << "\"" << std::endl; }
void runTcpServer(unsigned short port) { // Create a server socket to accept new connections sf::TcpListener listener;
// Listen to the given port for incoming connections if (listener.listen(port) != sf::Socket::Done) return; std::cout << "IP Address = " << sf::IpAddress::getPublicAddress().toString() << std::endl; std::cout << "Server is listening to port " << port << ", waiting for connections... " << std::endl;
while(running) { sf::TcpSocket socket; if(listener.accept(socket) == sf::Socket::Done) { // A new client just connected! std::cout << "New connection received from " << socket.getRemoteAddress() << std::endl; logged = true; } while(logged) { SendMsgTcp(socket); RecieveMsgTcp(socket); } } } void runTcpClient(unsigned short port) { // Ask for the server address sf::IpAddress server; do { std::cout << "Type the address or name of the server to connect to: "; std::cin >> server; } while (server == sf::IpAddress::None);
// Create a socket for communicating with the server sf::TcpSocket socket;
// Connect to the server if (socket.connect(server, port) != sf::Socket::Done) { std::cout << "Cannot connect to server " << std::endl; return; } std::cout << "Connected to server " << server << std::endl;
int main(int argc, char* argv[]) { // Choose an arbitrary port for opening sockets const unsigned short port = 5000;
// TCP, UDP or connected UDP ? char protocol; std::cout << "Do you want to use TCP (t) or UDP (u) ? "; std::cin >> protocol;
// Client or server ? char who; std::cout << "Do you want to be a server (s) or a client (c) ? "; std::cin >> who;
if (protocol == 't') { // Test the TCP protocol if (who == 's') runTcpServer(port); else runTcpClient(port); } else { // Test the unconnected UDP protocol if (who == 's') runUdpServer(port); else runUdpClient(port); }
// Wait until the user presses 'enter' key std::cout << "Press enter to exit..." << std::endl; std::cin.ignore(10000, '\n'); std::cin.ignore(10000, '\n');
So far I have this simple example running and I can't figure out why the Client() can't loop to allow the server to send it's messages and allow me to output them each loop? I have to type something first before I can see the sent message from the server... Any ideas?
#include "stdafx.h"
const unsigned short PORT = 5000; const std::string IPADDRESS("127.0.0.0.1");