Sign in to follow this  
nivlekio

Peer to Peer networking

Recommended Posts

nivlekio    156
Hey all! Im working on a uni course work project with 6 other guys making a real time strategy game, and I choose to do networking ( bad idea lol ). I have done some tutorials on win sock but cant find nothing on peer to peer stuff. Basically since its a uni project I wont be able to have a dedicated server which would make a lot easier. I want to create the peer to peer model for when the user enters the LAN or Internet network lobby, this is where they will see all the other players and hosted games. I am stuck on how to model this. I have a fair idea of what to do but I am lost in some areas. So far I have created a thread for the listing, once a peer connects to the binded port they are accept and are set to a different port. When the peer is accepted a packet is sent to them telling the info of the person they have connect to such as their name, lobby status (hosting, lobby, client in hosted room). I am stuck on the connecting bit “ ClientSocketObject.Connect() ” I don't know how to word this but I will try my best, how on earth do I search for the users IP address whom I want to connect to on the lobby? Also how do you go about sending a struct (if possible) and receiving it as a struct in stead of a char buffer?

Share this post


Link to post
Share on other sites
Palidine    1315
RTS games (because of the large amount of units) most often solve this with "lock-step-simulation". i.e. we synchronize our logic frame updates exactly between clients and all random number generation is guaranteed to return the same results on different clients (to ensure that the same simulation happens on each client). You can achieve the latter by passing around a common seed before simulation begins.

With this solution the only thing you have to pass across the network is user input and some checksum data to ensure that the simulations are synchronized.

This solution also means you need to start building the engine with this in mind from the very beginning: it controls how the entire main-loop works and such.

The RTS game I worked on basically had you updating one logic frame into the future and your current render frame is interpolated from the "last frame" and the "next frame" results. The ends up giving the user 1-logic frame duration of lag between input and unit response; we were running i think 16-20 logic frames per second so this fell within acceptable perceptual delay.

If you go peer-to-peer: which really means you assign 1 client randomly to be the server (or you do bandwidth tests and pick the one with the best upstream). However, as I said, you generally have asstons of units and as a result this route is going to have lots of problems with network lag.

-me

Share this post


Link to post
Share on other sites
Sirisian    2263
//edit didn't realize this was for a LAN, but meh. good code for anyone.

PHP and a simple mysql DB can handle lobby servers. (everyone I know has web hosting, so this isn't usually a problem)

RegisterServer.php
http://rafb.net/p/v9MK2q77.html
UpdateServer.php
http://rafb.net/p/I0VDoi18.html
ServerList.php used by the clients go see a server list
http://rafb.net/p/DaVwZm27.html

table:
ip int(11)
time int(14)
name varchar(255)
latency int(11)
playercount mediumint(9)
maxplayercount mediumint(9)

here's a tutorial on packets that will get you started fairly quickly:
http://gpwiki.org/index.php/Binary_Packet

just set up a format and send. You didn't say the language, but I have binary packets for a few languages.

Share this post


Link to post
Share on other sites
nivlekio    156
Thanks for the help but im still lost on the lan lobby bit of the game. If you have played any RTS games on lan like Starcraft, you enter the lobby and you can see if any one has hosted a game to play.

How would you go about coding, code to find an unknown ip of some one who is also playing the game?

Ive been searching alot on this but cant find anything.

Share this post


Link to post
Share on other sites
Antheus    2409
Quote:
Original post by nivlekio

How would you go about coding, code to find an unknown ip of some one who is also playing the game?


The one "also playing the game" contacts the central lobby server, and thereby provides the IP/port information.

Share this post


Link to post
Share on other sites
oliii    2196
whoever initiates the connection with host (the machine responsible for accepting new players) gets his public address (address behind his NAT, local IP address for LAN, ...) sent to other peers by the host. Then the peers can talk to each other.

That's pretty much it. Why cant you have a dedicated server anyway?

Share this post


Link to post
Share on other sites
Palidine    1315
Lobby works like this:

1) centralized server to act as matchmaker
2) client hosts game
3) in hosting a game, the engine contacts the central server which throws your IP and game into the shared lobby space (database)

4) now connecting clients, entering the lobby have access to the hosted games.

You can't do a lobby without a centralized, known server.

-me

Share this post


Link to post
Share on other sites
nivlekio    156
Not sure if im being stupid here sorry about that if i am and sorry if we are going in circles.

But there wont be a centralized server, it will be peers, looking for other unknown peers to connect to. So say three people run the game ( each game application wont know the other two users ip numbers) and they click on "play lan game" it will run code which will accpet on coming connections (if a peer frind them) and code to look for other unkown players( so if they find the other two players before they are found they will connect to them).

Once connected they will be able to talk to each other, see if some one has hosted a game, and if some one has hosted a they will be able to see who is in that game.

Say if a 4th person runs the game and clicks on "play lan game" they will do also do the same searching proccess and connect to the other players.

The reason why im coding the lan lobby like that is because I have seen games (starcraft, C&C Generals, WarCraft wtc) where you click on "play lan game" then you enter a lobby and you can see other people who are in this lobby and see if any one has hosted a game.

Is that not how they go about coding such a situation?

You can't have a centrlized server in this case (so i think) because every network has a diffrent ip formats and pool sizes from each other. One might be from 192.168.1.66 to 192.168.1.125 and another like 192.168.1.1 to 192.168.1.255. And seeing that no two networks have the same ip format the central server will have keep changing its ip and how will the other apllications know what it is if it has to keep on compansating on diffrent lan networks?

Also you will require one machine be a cental server is this not a bit pointless in th lan case becuase say if you have two people who want to play agaisnt each other on lan you will need a 3rd machine to be a central server, what happens if there is not 3rd machine?

Once again im trying to look for unknown peers who are also running the application and once found they are connected to each other. Im just stuck on that bit i pretty much have an idea on what to do after searching and connecting peers on the lan lobby.

Quote:

Q21) and Q24) in the Forum FAQ answer your question.


I have looked at those questions but they dont really help in my situation I think. Ill be using TCP/IP so i wont be able to do the UDP broadcasting and there will be no Central/local/master server it will be just peers looking for other peers to connect to form a peer to peer network with out a server just in the lobby stage.

Quote:

Lobby works like this:

1) centralized server to act as matchmaker
2) client hosts game
3) in hosting a game, the engine contacts the central server which throws your IP and game into the shared lobby space (database)

4) now connecting clients, entering the lobby have access to the hosted games.

You can't do a lobby without a centralized, known server.


I have seen games where if you click on "play lan game" you enter the lobby and you can see other peers in the network (if they have click on "play lan game". From what i think after the user clicks on "play lan game" there will be code that will accept on coming conenctions and code to search for unknown peers who are also in this lobby stage. I dont think there is a cental server in this case becuase when you play lan games no one sets one machine to become a central server in thse games.

But when a person hosts a room the hosting peer will become the server (for the game) and the other peers will be clients to the hosting peer. The clients will only talk to the host and the host will do the job of sending packets about the place.

Quote:

whoever initiates the connection with host (the machine responsible for accepting new players) gets his public address (address behind his NAT, local IP address for LAN, ...) sent to other peers by the host. Then the peers can talk to each other.

That's pretty much it. Why cant you have a dedicated server anyway?


If look above you will see why i want to have a dedicated/central server for the lobby stage. If can't get round my problem ill just have a dedicated server.

Share this post


Link to post
Share on other sites
matthewbot    122
Check out this article on multicasting. This will let you make a LAN game lobby without a centralized server. The basic idea is, each instance of your game joins a multicast group, which is just a class D IP address from 224.0.1.0 to 239.255.255.255. Whenever you want to find other peers, just send a UDP datagram to the multicast group's IP, and every instance of your game on the network will receive it. Multicast doesn't work over the internet however, so I would design your game so that Multicast is only used to find peers, but the actual game still uses regular sending and receiving. If you want to find peers over the entire internet, the only way I'm afraid is a centralized lobby server.

Share this post


Link to post
Share on other sites
hplus0603    11356
Quote:
Ill be using TCP/IP so i wont be able to do the UDP broadcasting


There is no way you can do discovery with TCP. It's not what that protocol is for.

Multicast is a fairly broken idea, and only works in small, well defined, isolated networks. It does not work for the general internet, and it is typically not supported by ISPs or gateways.

Share this post


Link to post
Share on other sites
oliii    2196
For a simple project, simplify your life and use a broadcast UDP socket, at least for the host discovery.

you just send a advertise request broadcast on a specific port your game host will listen to. When they receive a advertise request, then they send back a reply packet to the sender, to make the host known.

You just have to reserve a port for your application for its host advertising.

here's a quick example I made for some test code. nothing fancy.



#include <winsock2.h>
#include <stdio.h>
#include <memory.h>

void debugBreak()
{
__asm int 3;
}

#define assert(condition) if(!(condition)) debugBreak();

#pragma comment (lib, "wsock32.lib")

bool sendTo(SOCKET s, const char* data, int len, SOCKADDR_IN addr)
{
int result = ::sendto(s, data, len, 0, (const sockaddr*)&addr, sizeof(addr));
return (result == len);
}

bool sendMessage(SOCKET s, const char* msg, const char* data, int datalen, SOCKADDR_IN addr)
{
// send message with data
printf("sending \"%s\" to [%s:%d]...\n", msg, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

char packet[1288];
int msglen = (int)strlen(msg)+1;

// sanity check
if(msglen + datalen > sizeof(packet))
{
assert(false);
return false;
}

// copy message header and data
int packetlen = 0;
memcpy(packet + packetlen, msg, msglen); packetlen += msglen;
memcpy(packet + packetlen, data, datalen); packetlen += datalen;

// send packet
return sendTo(s, packet, packetlen, addr);
}

bool sendMessage(SOCKET s, const char* msg, SOCKADDR_IN addr)
{
printf("sending \"%s\" to [%s:%d]...\n", msg, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

return sendTo(s, msg, (int)strlen(msg)+1, addr);
}

bool broadcast(SOCKET s, const char* data, int len, int port)
{
SOCKADDR_IN addr;
ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_BROADCAST;
addr.sin_port = htons(port);

return sendTo(s, data, len, addr);
}

bool receive(SOCKET s, char* data, int& len, int maxLen, SOCKADDR_IN& from)
{
// read file descriptors
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(s, &readfds);

// time interval
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;

// check if data waiting
int result = ::select(1, &readfds, NULL, NULL, &tv);
assert(result != SOCKET_ERROR);

// no data pending in the socket
if(!FD_ISSET(s, &readfds))
return false;

int fromlen = sizeof(from);
len = ::recvfrom(s, data, maxLen, 0, (sockaddr*)&from, &fromlen);
return (len > 0);
}

const char* receiveMessage(SOCKET s, SOCKADDR_IN& from)
{
static char data[1288];
int len;
if(!receive(s, data, len, sizeof(data), from))
return NULL;

printf("received \"%s\" from [%s:%d]...\n", data, inet_ntoa(from.sin_addr), ntohs(from.sin_port));
return data;
}


const int GAME_PORT = 1000;

int findAddr(SOCKADDR_IN list[], int addrCount, SOCKADDR_IN addr)
{
for(int i = 0; i < addrCount; i ++)
{
if( list[i].sin_addr.s_addr == addr.sin_addr.s_addr &&
list[i].sin_port == addr.sin_port)
{
return i;
}
}
return -1;
}

bool bind(SOCKET s, int port)
{
SOCKADDR_IN addr;
ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);

int result = ::bind(s, (const sockaddr*)(&addr), sizeof(SOCKADDR_IN));
return (result != SOCKET_ERROR);
}

int searchHosts(SOCKADDR_IN hosts[], int maxHosts, int milliseconds)
{
int hostCount = 0;

// search for game
bool val = true;
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
int result = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const char*)&val, sizeof(val));
assert(s != NULL);
assert(result != SOCKET_ERROR);
int frame = 0;

int start = GetTickCount();
int send_tick = 0;

while (1)
{
if(((int)GetTickCount() - send_tick) > 1000)
{
send_tick = GetTickCount();

const char* request = "ADVERTISE_REQUEST";
printf("broadcasting %s, %d...\n", request, frame++);
broadcast(s, request, (int)strlen(request)+1, GAME_PORT);
}

if(((int)GetTickCount() - start) > milliseconds)
break;

// Poll socket for information
SOCKADDR_IN addr;
const char* msg = receiveMessage(s, addr);

if(msg != NULL)
{
// received advertise reply message
if (strcmp(msg, "ADVERTISE_REPLY") == 0)
{
// add host to the list
int index = findAddr(hosts, hostCount, addr);
if(index == -1)
{
printf("found host [%s:%d].\n", inet_ntoa(addr.sin_addr), addr.sin_port);
hosts[hostCount] = addr;
hostCount++;

if(hostCount >= maxHosts)
break;
}
}
}
Sleep(1);
}
closesocket(s);
return hostCount;
}

bool host()
{
printf("Hosting\n");

// clients in the game
const int MAX_CLIENTS = 16;
SOCKADDR_IN clients[MAX_CLIENTS];
memset(clients, 0, sizeof(clients));

// game socket
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
if(!bind(s, GAME_PORT))
{
closesocket(s);
return false;
}

int frame = 0;
int send_tick = 0;

while (1)
{
// send heartbeat
if(((int)GetTickCount() - send_tick) > 1000)
{
send_tick = GetTickCount();
printf("sending heartbeat %d...\n", frame++);

// send tick to clients
for(int i = 0; i < MAX_CLIENTS; i ++)
{
// client valid. send heartbeat
if(clients[i].sin_port != 0)
{
sendMessage(s, "HOST_TICK", clients[i]);
}
}
}

// read messages
SOCKADDR_IN addr;
const char* msg = receiveMessage(s, addr);

if(msg != NULL)
{
// advertise request
if(strcmp(msg, "ADVERTISE_REQUEST") == 0)
{
// send reply back
sendMessage(s, "ADVERTISE_REPLY", addr);
}

// join request
if(strcmp(msg, "JOIN_REQUEST") == 0)
{
// chek if client in the list
int slot = findAddr(clients, MAX_CLIENTS, addr);

// nope, add him to the list
if(slot == -1)
{
// find free slot
SOCKADDR_IN zero;
memset(&zero, 0, sizeof(zero));
slot = findAddr(clients, MAX_CLIENTS, zero);

// list is full. refuse the client
if(slot == -1)
{
sendMessage(s, "JOIN_REFUSE", addr);
}
else
{
// add him. send accept message. add slot info as parameters
clients[slot] = addr;
sendMessage(s, "JOIN_ACCEPTED", (const char*)&slot, sizeof(slot), addr);
}
}
else
{
sendMessage(s, "JOIN_ACCEPTED", (const char*)&slot, sizeof(slot), addr);
}
}
// a client tick
else if(strcmp(msg, "CLIENT_TICK") == 0)
{
// client should be in our list
int slot = findAddr(clients, MAX_CLIENTS, addr);

// do stuff....
}
}
Sleep(1);
}

closesocket(s);
return false;
}

bool join(SOCKADDR_IN host)
{
printf("Peering\n");

// game socket
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
int portCount = 100;
int i;
for(i = 0; i < portCount; i ++)
{
// try to bind to a port
if(bind(s, GAME_PORT + i))
break;
}

// failed to bind port.
if(i == portCount)
{
closesocket(s);
return false;
}

// state.
bool accepted = false;
int frame = 0;
int send_tick = 0;

while (1)
{
// not acepted yet. send request
if(!accepted)
{
if(((int)GetTickCount() - send_tick) > 1000)
{
send_tick = GetTickCount();

// send reply back
sendMessage(s, "JOIN_REQUEST", host);
}
}
else
{
if(((int)GetTickCount() - send_tick) > 1000)
{
send_tick = GetTickCount();

printf("sending heartbeat %d...\n", frame++);

sendMessage(s, "CLIENT_TICK", host);
}
}

// read messages
SOCKADDR_IN addr;
const char* msg = receiveMessage(s, addr);

if(msg != NULL)
{
// join game refused
if(strcmp(msg, "JOIN_REFUSE") == 0)
{
// quit
closesocket(s);
return false;
}

// join accepted
if(strcmp(msg, "JOIN_ACCEPTED") == 0)
{
// extract slot info
int slot;
memcpy(&slot, msg + strlen("JOIN_ACCEPTED")+1, sizeof(slot));

printf("accepted slot = (%d)\n", slot);
accepted = true;
}
// the host tick
else if(strcmp(msg, "HOST_TICK") == 0)
{
if(accepted)
{
// do stuff....
}
}
}
Sleep(1);
}

closesocket(s);
return false;
}

int main(void)
{

WSADATA wsa;
memset(&wsa,0,sizeof(wsa));
WSAStartup(WINSOCK_VERSION,&wsa);

SOCKADDR_IN hosts[16];
int hostCount = searchHosts(hosts, sizeof(hosts) / sizeof(*hosts), 6000);
printf("found %d hosts.\n", hostCount);

// no host found, host a game ourselves
if(hostCount == 0)
{
host();
}
// we found some hosts, join the first one
else
{
join(hosts[0]);
}
return 0;
}





[Edited by - oliii on February 24, 2008 3:10:18 PM]

Share this post


Link to post
Share on other sites
nivlekio    156
Hey guys thanks for your help!

I pretty much went down the UDP brodcasting route it seems to be working fine looked at your code oliii and Beej's to keep me on the right track :).

I run two instances if the program I made one to send and one to recive and the one that recives get the message :) (YAY!).

But when I run a 3rd prog its does not work, I know this is because the 1st reciving prog bounded that port it requested first. Will need more than pc to properly test out the prog tho.

I was wondering if this won't cause any unforseen problems, but can I use UDP on one port and TCP on another without any problems?

Also about packet collions say if I was reciving a TCP packet from one peer, then another peer broadcasted their info and both packets came at the same time would this cause a collision even tho they are diffrent socks on diffrent ports?

Once again thanks for your help guys.

Share this post


Link to post
Share on other sites
nivlekio    156
Oh yeah almost forgot to say once again going back to the games thing, if they use UDP broadcasting in the Lan Lobby to help peers find each other.

They boardcast on a certain port, what happens if on some one's pc that port is already taken? How do they solve that problem? Do they just broadcast on multiple ports?

Share this post


Link to post
Share on other sites
hplus0603    11356
If there are multiple programs using the same port, it won't work (unless all programs use SO_REUSEADDR).
Also, if some other program uses the same port for broadcasting, chances are that the data format of that program is not the same as yours. You should put some recognizable data at the beginning of the packet to easily filter out data that's not yours.

Share this post


Link to post
Share on other sites
oliii    2196
Yeah, you need to allocate a specific port to your host, and make sure no one uses it. It would be good to tell your project supervisor about it. Any port should do but you never know with university networks. Also, firewalls can block your traffic.

Like HPlus says, for extra security, you can add a randomly generated number (that is unique to your application) at the start of the packet, so that you wont receive garbage from another program that would accidently broadcast data to that port (it happened to me, I received some packets from a network printer :)).

The random number (aka a cryptogarphic nonce) can also help you out if you have several versions of the network code running (increment the lowest byte of the number for each version of the code you run).

As for the clients, it wont matter what port they are using. In the example, I do a port scan (I scan a 100 ports after the host port) to find an unused port. When bind() succeed, here is my port for my client :) That allows me to run several instance of the program on one machine. One host, and as many clients as I want.

Also, if you want to use a TCP socket for your game, then the host will have to run one TCP socket per client, plus a UDP socket to listen to broadcasts. using only UDP here, I run everything through that socket. This is also paricularly useful for online games and NAT punchthrough. One socket, no mess.

my $0.02.

Share this post


Link to post
Share on other sites
Antheus    2409
One solution is using UDP repeater.

First application that starts spawns the repeater process.

Repeater is a standalone process that handles broadcast notifications. It acts as some sort of singleton. When an application tries to broadcast, it checks if repeater process is running. If it isn't, it spawns it, if it is, it sends messages to it.

Repeater monitors clients that are connected to it. When last client disconnects, repeater shuts down.

This is a somewhat convenient solution for applications which are likely to need access to same port.

It can be implemented in application itself, but that makes the whole process slightly more complex, since clients must negotiate who'll become the new repeater if application that hosted the original one is shut down.

Share this post


Link to post
Share on other sites
hplus0603    11356
Quote:
you can add a randomly generated number (that is unique to your application) at the start of the packet


Actually, I prefer something non-random, such as the name of the game/application as a (short) string.

A cryptographic nonce is something that you can generate per session and exchange, or something that both sides know about; it's not quite the same thing. Specifically, you could have a new nonce per packet (if you include the nonce in the packet). I've come across cases where that seemed to make sense.

A UDP repeater is a useful tool, but the "check if it's running, else spawn one" process will suffer from race conditions, where more than one client will spawn the repeater. The way to solve that is for repeaters to detect other repeaters, and shut themselves down according to some rule. One rule that works OK is for a repeater to shut itself down when it sees another repeater with a numerically lower IP address. Note that you want to tell any clients you have already seen about the shutdown, so they don't have to wait for timeout before the go looking for the new repeater.

Share this post


Link to post
Share on other sites
nivlekio    156
Hey all having some problems trying to use my prog on a diffrent pc i have three files so far main.cpp, Sock.h and Sock.cpp I include the Sock.h in both the main and Sock.cpp the Sock.h has #include <winsock2.h> #include <stdio.h> and in main.cpp i have #include <iostream> #include <string> #include <stdio.h> #include <conio.h>.

when i run the prog on my pc it works fine but when i run it on any other pc i this error on these lines "Programe failed to start try reinstalling programe".

Whats going on? do i need some dll files to use on the other pc's if so how do i get them? Btw is there like a win32 sdk you need to install like DX9.0c sdk?

Share this post


Link to post
Share on other sites
Antheus    2409
Quote:
I include the Sock.h in both the mai........


Does your program compile and generate an exe?

Do you use Visual Studio?

If so, you need to provide Visual Studio redistributable run-time.

vcX0_redist.exe, where X is the internal version number of MVS (7,8 or 9). It's located in a redist directory somewhere in your MVS installation. Install that on target computer.


If not MVS, posting a more detailed error might help.

Share this post


Link to post
Share on other sites
nivlekio    156
Quote:

'OgreNetwork.exe': Loaded 'C:\OgreNetwork Copy UDP\Debug\OgreNetwork.exe', Symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\ws2_32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\ws2help.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcp80d.dll', Symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll', Symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\imm32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\lpk.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\usp10.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\oleaut32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\wininet.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\shlwapi.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\normaliz.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\iertutil.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\urlmon.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\psapi.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\mswsock.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\dnsapi.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\winrnr.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\wldap32.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\Program Files\Bonjour\mdnsNSP.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\iphlpapi.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\rasadhlp.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'OgreNetwork.exe': Loaded 'C:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
The program '[5716] OgreNetwork.exe: Native' has exited with code 0 (0x0).


Is that what you mean by "If so, you need to provide Visual Studio redistributable run-time."

If not what do you mean?

The error only occurs when i run it on another pc all it says is

Quote:

Networking.exe

This aplication has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this