Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 697
  • Last Modified:

CSocket and CSocketFile

I am trying to make  a simple client server application using CSocket and CSocketFile.
I have coded 2 thread functions, one listens for clients requests, while after moving beyond Accept()... first thread funtion "ServerStarter" is supposed to spin the other thread whoise function is "ClientHandler".
Code is as under
UINT ServerStarter(LPVOID pParam)
{CClientSocket*      clientsocket = new CClientSocket();
CListenSocket*      listensocket = new CListenSocket();
.
.
listensocket->Accept(*clientsocket);
CWinThread *def = AfxBeginThread(ClientHandler,clientsocket,THREAD_PRIORITY_BELOW_NORMAL,CREATE_SUSPENDED);
def->ResumeThread();
}
and "ClientHandler" is as under
UINT ClientHandler(LPVOID pParam)
{
((CClientSocket*)pParam)->init();

CString test = " hello server here";
*(((CClientSocket*)pParam)->in)<<test;
((CClientSocket*)pParam)->in->Flush();      
      return 0;
}

while init() is as under

void CClientSocket::init()
{

pSocketFile = new CSocketFile(this);
in = new CArchive(pSocketFile,CArchive::store);
out= new CArchive(pSocketFile,CArchive::load);

}

now programme give an "Assert_Valid" when it goes inside the init on the line
in = ........
to me, it seems that that socket is appearing an unvalid one to it. But if I dont start the thread "ClientHandler" and try to send to the data to client from first thread "ServerHandler" every things goes ok.
what could be the reason ?
0
daknight2000
Asked:
daknight2000
  • 2
1 Solution
 
daknight2000Author Commented:
I have also tried making "clientsocket" as a global variable  but it didnt help.
0
 
ShaunWildeCommented:
You should only use CSockets etc in a CWinThread (UI thread) type thread as the CWinThread contains all the initialization required to manage CSockets.

so in your OnAccept of your listener socket you would (pseudo code)

CListenSocket::OnAccept(...)
{
CSocket tempSocket;

Accept(&tempSocket);

CSocketThread*pThread=(CSocketThread*)AfxBeginThread(RUNTIME_CLASS(CSocketThread),...,CREATE_SUSPENDED);

pThread->tempHandle=tempSocket.Detach();

pThread->ResumeThread();
}

then you would attach your socket to your thread in the initinstance
class CSocketThread:public CWinThread
{
SOCKET tempHandle;
CClientSocket m_socket; // derived from CSocket

}

CSocketThread::InitInstance()
{
m_socket.Attach(tempHandle);
m_socket.Init();
}

0
 
daknight2000Author Commented:
thanx..
sorry i was busy ...so i got late
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now