基于TCP的C/S聊天程序socket编程,出了有关问题求帮助
基于TCP的C/S聊天程序socket编程,出了问题求帮助?
新学VC 编程序碰到问题了
基本思路:
1.创建线程,运行accept等待连接
2.WSAAsyncSelect() 注册FD_READ
其他的步骤就是 bind listen WSASend WSARecv了
但是最后发现发送数据失败。。
高手帮忙看看吧 感激不尽!
贴一部分代码
------解决方案--------------------
::PostMessage(hwnd,WM_SOCKCONN,0,(LPARAM)&sockConn);
应该就是这样的吧...
新学VC 编程序碰到问题了
基本思路:
1.创建线程,运行accept等待连接
2.WSAAsyncSelect() 注册FD_READ
其他的步骤就是 bind listen WSASend WSARecv了
但是最后发现发送数据失败。。
高手帮忙看看吧 感激不尽!
贴一部分代码
- C/C++ code
//socket初始化代码 BOOL CChatDlg::InitSocket() { m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0); if(INVALID_SOCKET==m_socket) { MessageBox("创建套接字失败!"); return FALSE; } SOCKADDR_IN addrSock; addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSock.sin_family=AF_INET; addrSock.sin_port=htons(8000); if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR))) { MessageBox("绑定失败!"); return FALSE; } if(SOCKET_ERROR==listen(m_socket,5)) { MessageBox("设置监听模式失败!"); return FALSE; } //accept线程代码,下面定义了一个static函数 DWORD WINAPI CChatDlg::AcceptProc(LPVOID lpParameter) { int len=sizeof(SOCKADDR); SOCKADDR_IN addrClient; SOCKET sock=((RECVPARAM*)lpParameter)->sock; HWND hwnd=((RECVPARAM*)lpParameter)->hwnd; SOCKET sockConn=((RECVPARAM*)lpParameter)->sockConn; delete lpParameter; sockConn=accept(sock,(SOCKADDR*)&addrClient,&len); ::PostMessage(hwnd,WM_SOCKCONN,0,(LPARAM)sockConn); return 0; } void CChatDlg::OnsockConn(SOCKET sock) { sockConn=sock; if(SOCKET_ERROR==WSAAsyncSelect(sockConn,m_hWnd,UM_SOCK,FD_READ)) { MessageBox("注册网络读取事件失败!"); return ; } } //发送功能代码 void CChatDlg::OnBtnSend() { // TODO: Add your control notification handler code here DWORD dwIP; CString strSend; int len; WSABUF wsabuf; DWORD dwSend; CString strHostName; SOCKADDR_IN addrTo; HOSTENT *pHost; if(GetDlgItemText(IDC_EDIT_HOSTNAME,strHostName),strHostName=="") //地址类型转换 不懂。。。 { ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); } else { pHost=gethostbyname(strHostName); addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]); } addrTo.sin_family=AF_INET; addrTo.sin_port=htons(7000); GetDlgItemText(IDC_EDIT_SEND,strSend); len=strSend.GetLength(); //strSend.GetBuffer 将一个cstring对象转换为一个char*返回 wsabuf.buf=strSend.GetBuffer(len); wsabuf.len=len+1;//让接收端有一个/0作为结尾 // 实际发送的数据字节数通过dwSend返回 if(SOCKET_ERROR==WSASend(sockConn,&wsabuf,1,&dwSend,0,NULL,NULL)) { MessageBox("发送数据失败!"); return; } SetDlgItemText(IDC_EDIT_SEND,""); //将发送编辑框内容清空 } //接收功能代码 void CChatDlg::OnSock(WPARAM wParam,LPARAM lParam) { switch(LOWORD(lParam)) { case FD_READ: WSABUF wsabuf; wsabuf.buf=new char[200]; wsabuf.len=200; DWORD dwRead; DWORD dwFlag=0; SOCKADDR_IN addrFrom; int len=sizeof(SOCKADDR); CString str; CString strTemp; HOSTENT *pHost; if(SOCKET_ERROR == WSARecv(sockConn,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL)) { MessageBox("接受数据失败!"); delete[] wsabuf.buf; return; } pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET); /*str.Format("%s说 :%s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);*/ str.Format("%s说 :%s",pHost->h_name,wsabuf.buf); str+="\r\n"; GetDlgItemText(IDC_EDIT_RECV,strTemp); str+=strTemp; SetDlgItemText(IDC_EDIT_RECV,str); delete[] wsabuf.buf; break; } } 有点乱 ,这个工程不知道怎么发 帮忙看看吧!
------解决方案--------------------
::PostMessage(hwnd,WM_SOCKCONN,0,(LPARAM)&sockConn);
应该就是这样的吧...