现在有一个server程序,两个client(client1,client2)程序运行,我把client的那个工程用vs打开了两次然后分别运行,与server建立连接,然后实现数据传输(client发送数据,然后server回发),我本来想连接之后,server向两个client同时发送相同的数据(比如client1向server发送数据,server同时向client1和client2发送数据),但是实际运行起来,是谁向server发送,server向谁发送。
linux下实现这种问题好像是用fork(),但是window没有fork()啊,听说createThread可以,但是查了一下好像很复杂,而且据说会发生内存泄露,不推荐使用。怎么办?有哪位可以帮忙解答一下MFC数据传输 socket
linux下实现这种问题好像是用fork(),但是window没有fork()啊,听说createThread可以,但是查了一下好像很复杂,而且据说会发生内存泄露,不推荐使用。怎么办?有哪位可以帮忙解答一下MFC数据传输 socket
http://download.csdn.net/detail/geoff08zhang/4571358
你自己用个链表保存客户端的SOCKET句柄等相关信息,这个当然需要动态维护,比如客户离开,需要从链表中删除。
能说说具体怎么加在哪加吗?
CSocket aSocket;
list <CSocket> serverSocket(2);
list <CSocket>::iterator i = serverSocket.begin();
if (!aSocket.Socket())
{
char szError[256] = {0};
sprintf(szError, "Create Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
} BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL); aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
if (!aSocket.Bind(nPort))
{
char szError[256] = {0};
sprintf(szError, "Bind Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
if(!aSocket.Listen(10))
{
char szError[256] = {0};
sprintf(szError, "Listen Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
CString strText;
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += "Server Start! \r\n";
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText); while(!m_exit)
{
if(!aSocket.Accept(*i))
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
for (i = serverSocket.begin();i!=serverSocket.end();i++)
{
i->Send("hhhhh",50);
i->Close();
}
}
i--;
}
aSocket.Close();
CSocket aSocket;
list <CSocket> serverSocket(2);
list <CSocket>::iterator i = serverSocket.begin();
if (!aSocket.Socket())
{
char szError[256] = {0};
sprintf(szError, "Create Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
} BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL); aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
if (!aSocket.Bind(nPort))
{
char szError[256] = {0};
sprintf(szError, "Bind Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
if(!aSocket.Listen(10))
{
char szError[256] = {0};
sprintf(szError, "Listen Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
CString strText;
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += "Server Start! \r\n";
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
InitializeCriticalSection( & cs);
while(!m_exit)
{
EnterCriticalSection( & cs);
if(!aSocket.Accept(*i))
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
for (i = serverSocket.begin();i!=serverSocket.end();i++)
{
i->Send("hhhhh",50);
i->Close();
}
}
i--;
LeaveCriticalSection( & cs);
}
完全可以做到Server对Client 1对多的情况
list <CSocket> serverSocket(2);
list <CSocket>::iterator i = serverSocket.begin();
if (!aSocket.Socket())//这是要干嘛
{
char szError[256] = {0};
sprintf(szError, "Create Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
} BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
if (!aSocket.Bind(nPort))//aSocket.Create在哪里?木有创建你就要绑定了?后面的我都不想看了
{
char szError[256] = {0};
sprintf(szError, "Bind Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
if(!aSocket.Listen(10))
{
char szError[256] = {0};
sprintf(szError, "Listen Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}
CString strText;
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += "Server Start! \r\n";
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
InitializeCriticalSection( & cs);
while(!m_exit)
{
EnterCriticalSection( & cs);
if(!aSocket.Accept(*i))
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0}; i->Receive(szRecvMsg, 256); sprintf(szOutMsg, "%s \r\n", szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
for (i = serverSocket.begin();i!=serverSocket.end();i++)
{
i->Send("hhhhh",50);
i->Close();
}
}
i--;
LeaveCriticalSection( & cs);
}
顺便说一句,不加那些容器的话运行成功,这能说明什么呢,难道没有创建socket还能成功运行?