Re: Using same port number to connect more than one application to
See below:
nexolite wrote:
No reason I can imagine this would be possible.
It would be the role of your server to decide that an incoming message from X should be
sent to Y and an incoming message from Y should be sent to X. You would write code to
manage this and do it.
Note that you have still not shown the code that is causing the problem.
*************
Even I know this is possible, and obviously I was not able to write code
properly,
that's why I asked you, since you and others here are much experienced!
Also I cannot use code from other sources , Here I have to use my own code.
and I was not believing on my code thinking it is completely wrong.
OK , here is my code .
#include<afxwin.h>
#include<afxsock.h>
#include<vector>
#include "resource.h"
using namespace std;
class ConnectionManagerDialog : public CDialog
{
public:
int i;
CListBox from,to;
ConnectionManagerDialog(int n):CDialog(n){i=0;}
void OnAccept();
void OnRecieve();
BOOL OnInitDialog();
};
class ConSock : public CAsyncSocket
{
public:
CDialog *pwnd;
void SetParent(CDialog *mpwnd)
{
pwnd=mpwnd;
}
void OnAccept(int nErrorCode)
{
if (nErrorCode == 0)
((ConnectionManagerDialog*)pwnd)->OnAccept();
CAsyncSocket::OnAccept(nErrorCode);
}
void OnReceive(int nErrorCode)
{
if(nErrorCode==0)
((ConnectionManagerDialog*)pwnd)->OnRecieve();
At this point, the instance of ConSock defines which connection you're
working with. Do the Receive in ConSock::OnReceive() or pass some sort
of indicator to ConnectionManagerDialog::OnReceive().
CAsyncSocket::OnReceive(nErrorCode);
}
}serv,serv1;
vector<ConSock*> servs; //To store the socks created with 'new'
BOOL ConnectionManagerDialog::OnInitDialog()
{
AfxSocketInit();
serv.SetParent(this);
if(serv.Create(4945))
{
if(serv.Listen())
MessageBox("listening");
else MessageBox("listen failed");
}
else{
MessageBox("create sock failed");
}
return CDialog::OnInitDialog();
}
void ConnectionManagerDialog::OnAccept()
{
ConSock *servn = new ConSock;
servs.push_back(servn);
serv.Accept(*servn);
}
void ConnectionManagerDialog::OnRecieve()
{
/*loop through all the servs[]->recive()
Since I dont understand how I come to know for which this OnRecieve() was
called I loop through all!
and even this does not work properly , properly means according to me it
should receive data from the socket for which OnRecieve was called
and send "hello" (only for testing) to it*/
Note that there's no reason not to an additional parameter to
OnRecieve() indicating the connection.
/*This is the place where I m STUCK!!!*/
char data[100];
int read;
for(int i=0;i<(int)servs.size();i++)
{
read=servs[i]->Receive(data,100*sizeof(char));
if(read>0)
servs[i]->Send("hello",sizeof("hello"));
}
CString str;
str.Format("\nBytes Read=%d",read);
OutputDebugString(str);
TRACE(data);
if(read==SOCKET_ERROR)
{MessageBox("SOCKET_ERROR");
}
else{
data[read]=NULL;
OutputDebugString(data);
}
}
class ConnectionManagerApp:public CWinApp
{
public:
int InitApplication()
{
ConnectionManagerDialog d(IDD_DIALOG1);
m_pMainWnd=&d;
d.DoModal();
return TRUE;
}
}a;