Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

CSocket and CSocketFile

Posted on 2000-03-07
3
Medium Priority
?
684 Views
Last Modified: 2013-11-20
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
Comment
Question by:daknight2000
  • 2
3 Comments
 

Author Comment

by:daknight2000
ID: 2593942
I have also tried making "clientsocket" as a global variable  but it didnt help.
0
 
LVL 9

Accepted Solution

by:
ShaunWilde earned 400 total points
ID: 2594627
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
 

Author Comment

by:daknight2000
ID: 2607522
thanx..
sorry i was busy ...so i got late
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
In this post we will learn different types of Android Layout and some basics of an Android App.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In response to a need for security and privacy, and to continue fostering an environment members can turn to for support, solutions, and education, Experts Exchange has created anonymous question capabilities. This new feature is available to our Pr…

886 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question