adsl能建聊天程序吗
我用的是网通的ADSL宽带上网,想编个聊天程序,在Internet网上用,不知能行吗?怎么实现?
程序代码:
BOOL CChatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
InitSocket();//套接字创建绑定初始化
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->sock=m_socket;
pRecvParam->hwnd=m_hWnd;
//创建接收线程
HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
//关闭该接收线程句柄,释放其引用计数
CloseHandle(hThread);
//设置默认服务器地址
SetDlgItemText(IDC_SEV_ADDR,"sosh.vicp.cc");
return TRUE; // return TRUE unlesBOOL CChatDlg::InitSocket()
{
//创建套接字
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if (INVALID_SOCKET==m_socket)
{
MessageBox("套接字创建失败!");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int retval;
//绑定套接字
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if (SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox("绑定失败!");
return FALSE;
}
return TRUE;
}
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
// 获取主线程传递的套接字和窗口句柄
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);
char recvBuf[1000];
char tempBuf[2000];
int retval;
while (TRUE)
{
//接收数据
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if (SOCKET_ERROR==retval)
{
break;
}
CString ipstr=inet_ntoa(addrFrom.sin_addr);
if (ipstr=="127.0.0.1")
{
sprintf(tempBuf,"我 说: %s",recvBuf);
}
else
{
sprintf(tempBuf,"%s 说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
}
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}
void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
//取出接收到的数据
CString str=(char*)lParam;
CString strTemp;
//获取当前系统时间
ctime=CTime::GetCurrentTime();
//格式化获取的时间
strtime=ctime.Format("发送时间(%H:%M:%S)");
//获得已有数据
GetDlgItemText(IDC_EDIT_RECV,strTemp);
/*
str+="\r\n";
str+=strTemp;
*/
strTemp+=strtime;
strTemp+="\r\n";
strTemp+=str;
strTemp+="\r\n\r\n";
//显示所有接收到的数据
SetDlgItemText(IDC_EDIT_RECV,strTemp);
//编辑框滚动条控制
CEdit* pEdit = (CEdit*)this->GetDlgItem(IDC_EDIT_RECV);
if (pEdit != NULL)
{
pEdit->LineScroll(pEdit->GetLineCount());
}
}
void CChatDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
//获取对方IP
/*
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
*/
CString strSend;
//获得待发送数据
GetDlgItemText(IDC_EDIT_SEND,strSend);
//发送数据
sendto(m_socket,strSend,strSend.GetLength()+1,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
sendto(m_socket,strSend,strSend.GetLength()+1,0,
(SOCKADDR*)&addrToMe,sizeof(SOCKADDR));
//清空发送编辑框中的内容
SetDlgItemText(IDC_EDIT_SEND," ");
GetDlgItem(IDC_EDIT_SEND)->SetFocus();
}
void CChatDlg::OnServerl()
{
// TODO: Add your control notification handler code here
CString Sertext,Ipaddr;
GetDlgItemText(IDC_SERVERL,Sertext);
if (Sertext=="登陆服务器[未连接]")//登陆服务器获取服务器IP
{
CString strServerlName;
HOSTENT* pHost;
addrTo.sin_family=AF_INET;
addrToMe.sin_family=AF_INET;
addrTo.sin_port=htons(6000);
addrToMe.sin_port=htons(6000);
GetDlgItemText(IDC_SEV_ADDR,strServerlName);
pHost=gethostbyname(strServerlName);
addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
addrToMe.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
SetDlgItemText(IDC_SERVERL,"服务器[已经连接]");
}
else
{
MessageBox("服务器已经重新链接!");
CString strServerlName;
HOSTENT* pHost;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);
GetDlgItemText(IDC_SEV_ADDR,strServerlName);
pHost=gethostbyname(strServerlName);
addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
if (strServerlName=="sosh.vicp.cc")
{
SetDlgItemText(IDC_SERVERL,"服务器[已经连接]");
}
else
{
SetDlgItemText(IDC_SERVERL,"目标地址[已经连接]");
}
}
}s you set the focus to a control}
这是主要的代码,你自己看看吧







