18,356
社区成员
发帖
与我相关
我的任务
分享
BOOL CListWinDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,2);
sockSer=socket(AF_INET,SOCK_STREAM,0);
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(5566);
addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
int len =sizeof(SOCKADDR);
bind(sockSer,(SOCKADDR*) &addrSer,len);
listen(sockSer,5);
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->sock=sockSer;
pRecvParam->hwnd=m_hWnd;
HANDLE hThread=CreateThread(NULL,0,WaitProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
return 0;
}
DWORD WINAPI CListWinDlg::WaitProc(LPVOID lpParameter) //接受连接线程
{
CListWinDlg *pServer=new CListWinDlg;
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
SOCKET sockConn;
SOCKADDR_IN addrCli;
int len =sizeof(SOCKADDR);
int num=0;
while(1)
{
Sleep(10); //这句有什么用?
sockConn=accept(sock,(SOCKADDR*) &addrCli,&len);
if(INVALID_SOCKET == sockConn)
{
CString strNotice = "accept()失败,再次尝试 ...... ";
::AfxMessageBox(strNotice);
continue;
}
else{ AfxMessageBox("一个客户端已成功连接");
// pServer->m_listConn.push_back(addrCli);
// pServer->m_sockConn.push_back(sockConn);
pServer->m_Clients[num]=sockConn; //将套接字保存到数组中,
pServer->addrFrom[num]=addrCli;
num++;
} //将套接字地址保存到数组中
// int num2=sizeof(pServer->m_Clients)/sizeof(pServer->m_Clients[0]);
}
return TRUE;
}
void CListWinDlg::OnSend()
{
char buff[200];
char * ct;
CTime time = CTime::GetCurrentTime(); //获取当前时间
CString t = time.Format(" %H:%M:%S"); //设置时间显示格式
ct=(char*)t.GetBuffer(0); //cstring 转 char*
c_sendbuf.GetWindowText(buff,200);
c_sendbuf.SetWindowText(NULL);
CString Ser="服务器: >";
strcat(buff,ct);
int iSendFalseCount=0;
CListWinDlg *pServer=new CListWinDlg;
// for (sockiterator = m_sockConn.begin(); sockiterator != m_sockConn.end(); ++sockiterator)
// for (list<SOCKET>::iterator itr=pServer->m_sockConn.begin();itr!=pServer->m_sockConn.end();itr++)
for(int i=0;i<3;i++)
{
int vetcal=send(pServer->m_Clients[i],buff,strlen(buff)+1,0);
if (vetcal==SOCKET_ERROR)
iSendFalseCount++;
}
iSendFalseCount=WSAGetLastError();
char strtemp[5];
itoa(iSendFalseCount, strtemp, 10);
AfxMessageBox(strtemp);
}
struct RECVPARAM
{
SOCKET sock;
HWND hwnd;
};
class CListWinDlg : public CDialog
{
// Construction
public:
CListWinDlg(CWnd* pParent = NULL); // standard constructor
SOCKET sockSer,sockConn;
SOCKET m_Clients[10]; //保存套接字的数组
SOCKADDR_IN addrFrom[10];
list<SOCKET> m_sockConn;
list<SOCKADDR_IN> m_listConn;
list<SOCKET>::iterator sockiterator;
SOCKADDR_IN addrSer;
list<string> test;
list<string>::iterator testiterator;
static DWORD WINAPI WaitProc(LPVOID lpParameter);
static DWORD WINAPI RecvProc(LPVOID lpParameter);
//*******本来在chatDlg.h中定义的,现在移到这里,为解决连接时重复定义问题
SOCKET * m_Clients[10]; //保存套接字的数组
SOCKADDR_IN addrCli[10];
int num;
//****************************************************