[求助]关于WSAAsyncSelect 无法获取FD_READ的执行

Dare 2011-04-30 07:06:50
我想实现的是点对点聊天通信
客户端和服务器 我混编在一起了
对于FD_ACCEPT的执行很正常,就是无法执行FD_READ。
也就是说可以建立连接,但无法互发文字(我的推测实际是发过来了,但是无法捕捉到)
大家帮忙看看这是怎么回事 谢谢了

static int Flag=-1; //模式标记 -1为初试状态 0为服务器 1为客户端
int acceptn=0; //accept()标志


COODlg::COODlg(CWnd* pParent /*=NULL*/)
: CDialogEx(COODlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COODlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(COODlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SR, &COODlg::OnBnClickedSr)
ON_BN_CLICKED(IDC_CR, &COODlg::OnBnClickedCr)
ON_BN_CLICKED(IDC_ON, &COODlg::OnBnClickedOn)
ON_MESSAGE(WM_SOCKET,&OnSocket)
ON_BN_CLICKED(IDC_OFF, &COODlg::OnBnClickedOff)
END_MESSAGE_MAP()


// COODlg 消息处理程序

BOOL COODlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
GetDlgItem(IDC_ON)->EnableWindow(false);
GetDlgItem(IDC_OFF)->EnableWindow(false);
GetDlgItem(IDC_ADDRTEXT)->EnableWindow(false);
GetDlgItem(IDC_PORTTEXT)->EnableWindow(false);
GetDlgItem(IDC_SEND)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void COODlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR COODlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}



void COODlg::OnBnClickedSr() //服务器单选按钮函数
{
// TODO: 在此添加控件通知处理程序代码
Flag=0;
GetDlgItem(IDC_ON)->EnableWindow(true);
GetDlgItem(IDC_ADDRTEXT)->EnableWindow(false);
GetDlgItem(IDC_PORTTEXT)->EnableWindow(false);
}


void COODlg::OnBnClickedCr() //客户端单选按钮函数
{
// TODO: 在此添加控件通知处理程序代码
Flag=1;
GetDlgItem(IDC_ON)->EnableWindow(true);
GetDlgItem(IDC_ADDRTEXT)->EnableWindow(true);
GetDlgItem(IDC_PORTTEXT)->EnableWindow(true);
}


void COODlg::OnBnClickedOn() //连线按钮函数
{
CString displaystr="",strtemp="";
// TODO: 在此添加控件通知处理程序代码
if(Flag==0)
{
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr =+"正在寻找 请等待...\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
self_addr.sin_family=AF_INET;
self_addr.sin_addr.S_un.S_addr=INADDR_ANY;
self_addr.sin_port=htons(75);
self_socket=::socket(AF_INET,SOCK_STREAM,0);
::bind(self_socket,(sockaddr *)&self_addr,sizeof(self_addr));
::listen(self_socket,2);
::WSAAsyncSelect(self_socket,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);

/*************界面设置***********/
GetDlgItem(IDC_SR)->EnableWindow(false);
GetDlgItem(IDC_CR)->EnableWindow(false);
GetDlgItem(IDC_ON)->EnableWindow(false);
GetDlgItem(IDC_ADDRTEXT)->EnableWindow(false);
GetDlgItem(IDC_PORTTEXT)->EnableWindow(false);

}
else if(Flag==1)
{
int port;
CString addrstr="",portstr="";
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowTextA(displaystr);
displaystr +="正在连接...\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
GetDlgItem(IDC_ADDRTEXT)->GetWindowText(addrstr);
GetDlgItem(IDC_PORTTEXT)->GetWindowText(portstr);
if(addrstr==""||portstr=="")
{
MessageBox("IP地址与端口不能为空");
}
else
{
port=atoi(portstr.GetBuffer(1));
other_addr.sin_family=AF_INET;
other_addr.sin_addr.S_un.S_addr=inet_addr(addrstr.GetBuffer(1));
other_addr.sin_port=ntohs(port);
other_socket=::socket(AF_INET,SOCK_STREAM,0);
if(::connect(other_socket,(sockaddr *)&other_addr,sizeof(other_addr))!=SOCKET_ERROR)
{
::WSAAsyncSelect(other_socket,this->m_hWnd,WM_SOCKET,FD_READ);
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr =+"与服务器连线成功!!!\r\n\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);


/*************界面设置***********/
GetDlgItem(IDC_SR)->EnableWindow(false);
GetDlgItem(IDC_CR)->EnableWindow(false);
GetDlgItem(IDC_ON)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
GetDlgItem(IDC_SEND)->EnableWindow(true);
GetDlgItem(IDC_OFF)->EnableWindow(true);
GetDlgItem(IDC_ADDRTEXT)->EnableWindow(false);
GetDlgItem(IDC_PORTTEXT)->EnableWindow(false);
}
else
MessageBox("连接失败!!");

}
}
}


LRESULT COODlg::OnSocket(WPARAM wParam,LPARAM lParam) //自定义消息函数
{
CString strtemp="";
char temp[100]="";
CString displaystr="";
if(Flag==0)
{
switch(lParam)
{
case FD_ACCEPT:

other_socket=::accept(self_socket,(sockaddr *)&other_addr,(int *)sizeof(other_addr));
if(acceptn==0)
{
strtemp=(LPTSTR)::inet_ntoa(other_addr.sin_addr);
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr +="\r\n与";
displaystr +=strtemp;
displaystr +="连线成功!!!\r\n\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
acceptn++;
}
/*****界面设置*****/
GetDlgItem(IDC_OFF)->EnableWindow(true);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
GetDlgItem(IDC_SEND)->EnableWindow(true);
break;
case FD_READ:
::recv(other_socket,temp,sizeof(temp),0);
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr +=(LPTSTR)::inet_ntoa(other_addr.sin_addr);
displaystr +="对您说:\r\n";
displaystr +=temp;
displaystr +="\r\n\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
break;
}
}
else if(Flag==1)
{
if(lParam==FD_READ)
{
::recv(other_socket,temp,sizeof(temp),0);
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr +=(LPTSTR)::inet_ntoa(other_addr.sin_addr);
displaystr +="对您说:\r\n";
displaystr +=temp;
displaystr +="\r\n\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
}
}
return 0;
}



void COODlg::OnBnClickedOff() //挂断按钮函数
{
// TODO: 在此添加控件通知处理程序代码
CString displaystr="",emptystr="";
char offmessage[]="\r\n\r\n对方已经断开连接,请点击“挂断按钮”\r\n\r\n";
if(Flag==0)
{
::send(other_socket,offmessage,sizeof(offmessage),0);
::closesocket(self_socket);
::closesocket(other_socket);
Flag=-1;
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr +="\r\n\r\n服务器断开连接\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
acceptn=0;

/******界面设置********/
GetDlgItem(IDC_SR)->EnableWindow(true);
GetDlgItem(IDC_CR)->EnableWindow(true);
GetDlgItem(IDC_SEND)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
GetDlgItem(IDC_OFF)->EnableWindow(false);
}
else if(Flag==1)
{
::send(other_socket,offmessage,sizeof(offmessage),0);
::closesocket(other_socket);
Flag=-1;
GetDlgItem(IDC_DISPLAYTEXT)->GetWindowText(displaystr);
displaystr +="\r\n\r\n客户端断开连接\r\n";
GetDlgItem(IDC_DISPLAYTEXT)->SetWindowText(displaystr);
acceptn=0;

/******界面设置********/
GetDlgItem(IDC_ADDRTEXT)->SetWindowText(emptystr);
GetDlgItem(IDC_PORTTEXT)->SetWindowText(emptystr);
GetDlgItem(IDC_SR)->EnableWindow(true);
GetDlgItem(IDC_CR)->EnableWindow(true);
GetDlgItem(IDC_SEND)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
GetDlgItem(IDC_OFF)->EnableWindow(false);
}
}
...全文
98 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dare 2011-04-30
  • 打赏
  • 举报
回复
找到为题所在了。。。
Dare 2011-04-30
  • 打赏
  • 举报
回复
哎 真的。。。郁闷了 实在找不到哪里出了问题哦!!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧