• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 745
  • 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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

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