读书人

100分求子进程怎么获得主进程传递的参

发布时间: 2012-01-19 00:22:28 作者: rapoo

100分求子进程如何获得主进程传递的参数
我在主进程里LISTEN套接字,然后为了避免死机,准备在子进程里进行ACCEPT,然后每接到一个连接,就开一个子进程.
我的问题是,我在主进程里绑定监听的套接子怎么传给子进程,让ACCEPT用呢
谢谢回答

[解决办法]
我觉得lz的做法不好。
[解决办法]
我不知道楼主的做法好不好,但觉得很夸张,呵呵~
[解决办法]
先告诉大家,你的目的是什么??
貌似你需要的不是多进程,而是多线程。
[解决办法]
这么样建进程真的是头一次见过,有没有问题不知道,但是长见识了。
[解决办法]
MS多进程是在PHP之类的web服务上用得比较多,自己写服务一般还是多线程的就行了。
楼主是不是口误,不同的做法传递参数的方式也不同的。
[解决办法]
那楼主应该需要的是多线程就行了
[解决办法]
GetCommandLine
[解决办法]
这样的话,多线程就可以,不用多进程。

我一开始还以为说主程序不稳定,会崩溃呢……
[解决办法]
死机就死机呗,如果你的程序就是专门的服务器的话,阻塞也无所谓。

如果你的服务器是一个带操作界面的(比如基于对话框或者单文档、多文档的),而你又想使用阻塞式socket的话,那么显然不应该在主线程里listen和accept。另开一个通信的工作线程就OK了。
[解决办法]
不难受啊。。。

一般的做法是线程函数里面调用当前类的另一个函数就可以了,具体的功能都在后一个函数中完成。我一般给这两个函数取同样的名字,然后线程函数前面加一个下划线来区分:

UINT WINAPI CMyClass::_ThreadFun(LPVOID pParam)
{
ASSERT(pParam);
CMyClass *p=reinterpret_cast <CMyClass *> (pParam);
p-> ThreadFun();
CloseHandle(p-> m_hThread);
p-> m_hThread=0;
return 0;
}

void CMyClass::ThreadFun()
{
...
// 完成你想要的功能
...
}
[解决办法]
建议楼主看一下〈windows网络编程这本书》.
[解决办法]
同意woodcheaper() ,这个你都是可以派发出去的嘛。
比如windows里的窗口过程也只是一个全局函数呀,那它把所有的消息都派发到对应窗口对象的一个个消息响应函数里去了呀。
[解决办法]
然后给_ThreadFun传递的参数是CMyClass的this指针就行~

unsigned int nDummy;
m_hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadFun,this,
CREATE_SUSPENDED,&nDummy);
if (!m_hThread)
{
TRACE(_T( "Couldn 't start a thread\n "));
return;
}
else
{
::ResumeThread(m_hThread);
}
[解决办法]
就是这样,很easy了~
[解决办法]
能实现:

//这个是你的监听主线程,如果有连接则创建一个接收线程RecvThread
DWORD WINAPI ListenThread(LPVOID lpParameter)
{
SOCKET svrsck = (SOCKET)lpParameter;
//存储client的地址
SOCKADDR_IN recv_soure_sock;
int recv_soure_sock_len=sizeof(recv_soure_sock);
//存储收到的数据
while(WaitForSingleObject(ghv_ThreadEnd,0) != WAIT_OBJECT_0)
{
int nret=listen(svrsck,SOMAXCONN);
if(nret!= SOCKET_ERROR )
{
//接收连接
clientsck=accept(svrsck,(sockaddr *)&recv_soure_sock, &recv_soure_sock_len);

if ( clientsck> 0)
{

DWORD tid;
HANDLE m_hrecv;
if((m_hrecv=CreateThread(NULL,0,RecvThread,(void *)clientsck,0,&tid)) == NULL)
{


FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );

printf( "%s \n ",(LPTSTR) lpMsgBuf);


}

}
}
}
return 0;
}
//接收线程:
DWORD WINAPI Recv(LPVOID lpParameter)
{
SOCKET recvsock = (SOCKET )lpParameter;
SOCKADDR_INaddr;

int lens=sizeof(addr);
getpeername (recvsock,(sockaddr *)&addr,&lens);

printf( "IP:%s connected!.............\n ",inet_ntoa(addr.sin_addr));

//-----------------------------------------------为了看端口状态设定

fd_set rfs;

struct timeval ti;
FD_ZERO (&rfs);
FD_SET (recvsock, &rfs);
ti.tv_sec = RCV_TIMEOUT;
ti.tv_usec = 0;
int ret=0;


while( WaitForSingleObject(ghv_ThreadEnd,0) != WAIT_OBJECT_0)
{
long iRet=0;
char recvbuf[1024 * 4];

iRet=recv(tinfo.sock,recvbuf,1024*4,0);//recvbuf为接收的数据,iRet为接收数据长度
............................
}
...........................
return 0;
}

读书人网 >VC/MFC

热点推荐