我用VS2010编译一个简单的 客户服务器聊天工具.编译无错误能运行,但是客户机怎么也连不上服务器,下面贴关键代码,求指正啊.
//客户机代码..............................................
#define WM_SOCKET WM_USER+99
// CClientDlg 对话框
class CClientDlg : public CDialogEx
{
// 构造
public:
CClientDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_CLIENT_DIALOG };
SOCKET s; //套接字
sockaddr_in addr; //地址
afx_msg LRESULT OnSocket(WPARAM wParam,LPARAM lParam); //自定义消息函数
BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CONNECT, &CClientDlg::OnBnClickedConnect)
ON_BN_CLICKED(IDC_SEND, &CClientDlg::OnBnClickedSend)
ON_MESSAGE(WM_SOCKET,OnSocket) //自定义连接消息和消息处理函数
END_MESSAGE_MAP()
BOOL CClientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
GetDlgItem(IDC_TEXT)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
GetDlgItem(IDC_SEND)->EnableWindow(false);
s=::socket(AF_INET,SOCK_STREAM,0);
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("欢迎您!\r\n"));
::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_READ); //设置为异步模式
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
LRESULT CClientDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{ //自定义消息函数............
char cs[100]={0};
if(lParam==FD_READ)
{
CString num;
::recv(s,cs,100,NULL);
GetDlgItem(IDC_TEXT)->GetWindowTextW(num);
num+="\r\n服务器说:";
num+=(LPSTR)(LPCTSTR)cs;
GetDlgItem(IDC_TEXT)->SetWindowTextW(num);
}
return 0;
}
void CClientDlg::OnBnClickedConnect()
{ //连接按钮.....
// TODO: 在此添加控件通知处理程序代码
CString str,str1;
int port;
GetDlgItem(IDC_ADDR)->GetWindowTextW(str);
GetDlgItem(IDC_PORT)->GetWindowTextW(str1);
if(str=="" || str1=="")
MessageBox(_T("服务器地址或端口不能为空\r\n"));
else
{
port=atoi((LPSTR)(LPCTSTR)(str1));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.S_un.S_addr=inet_addr((LPSTR)(LPCTSTR)(str));
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("正在连接服务器......\r\n"));
if(::connect(s,(sockaddr*)&addr,sizeof(addr))!=SOCKET_ERROR)
{
GetDlgItem(IDC_TEXT)->GetWindowTextW(str);
str+="连接服务器成功!\r\n";
GetDlgItem(IDC_TEXT)->SetWindowTextW(str);
GetDlgItem(IDC_SEND)->EnableWindow(true);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
GetDlgItem(IDC_ADDR)->EnableWindow(false);
GetDlgItem(IDC_PORT)->EnableWindow(false);
}
else
{
GetDlgItem(IDC_TEXT)->GetWindowTextW(str);
str+="连接服务器失败!清重试......\r\n";
GetDlgItem(IDC_TEXT)->SetWindowTextW(str);
}
}
}
//服务器代码.............................
#define WM_SOCKET WM_USER+100
class CServerDlg : public CDialogEx
{
// 构造
public:
CServerDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_SERVER_DIALOG };
SOCKET s,s1;
sockaddr_in addr,addr1;
int n;
afx_msg LRESULT OnSocket(WPARAM wParam,LPARAM lParam); //自定义消息函数......
}
BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_SOCKET,OnSocket) //连接自定义消息与处理函数
ON_BN_CLICKED(IDC_SEND, &CServerDlg::OnBnClickedSend)
END_MESSAGE_MAP()
BOOL CServerDlg::OnInitDialog()
{
n=0;
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
s=::socket(AF_INET,SOCK_STREAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr*)&addr,sizeof(addr));
::listen(s,2);
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("欢迎您\r\n"));
GetDlgItem(IDC_TEXT)->EnableWindow(false);
GetDlgItem(IDC_ADDR)->SetWindowText(_T("服务器监听已经启动!"));
::WSAAsyncSelect(s1,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); //设置为异步模式
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{ //消息处理函数......
CString str13;
char cs[100];
int m=sizeof(addr1);
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
s1=::accept(s,(sockaddr*)&addr1,&m);
n++;
str13.Format(LPTSTR("有%d个客户已经连接上"),n);
GetDlgItem(IDC_TEXT)->SetWindowTextW(str13);
str13+=::inet_ntoa(addr1.sin_addr);
str13+=_T("登陆\r\n");
GetDlgItem(IDC_TEXT)->SetWindowTextW(str13);
}
break;
case FD_READ:
{
CString num;
::recv(s1,cs,100,0);
GetDlgItem(IDC_TEXT)->GetWindowTextW(num);
num+="\r\n";
num+=LPTSTR(::inet_ntoa(addr1.sin_addr));
num+=LPTSTR("对您说:");
num+=LPTSTR(cs);
GetDlgItem(IDC_TEXT)->SetWindowTextW(num);
}
break;
}
return 0;
}
求大神......