UDP利用SELECT接收不到数据?

monk_CD 2011-11-23 11:26:09
下面是代码:

DWORD CTalkDialog::TextOrFileSend(LPVOID lpParameter) //这里利用SELECT这个函数,作为消息中心!
{
CTalkDialog *pTalkDialog=(CTalkDialog*) lpParameter;

fd_set AllSocket;//包含了文本通讯的socket与文件传输的socket;
fd_set WirteSocket;
fd_set ReadSocket;

FD_ZERO(&AllSocket);
//FD_SET(pTalkDialog->m_ServTxSock,&AllSocket);
//FD_SET(pTalkDialog->m_CliTxSock,&AllSocket);

while(TRUE)
{
FD_ZERO(&WirteSocket);
FD_ZERO(&ReadSocket);

FD_SET(pTalkDialog->m_CliTxSock,&WirteSocket);
FD_SET(pTalkDialog->m_ServTxSock,&ReadSocket);

int nRect=select(0,&ReadSocket,&WirteSocket,0,0);

if(nRect>0)
{
if(FD_ISSET(pTalkDialog->m_ServTxSock,&ReadSocket))
{
pTalkDialog->RecvText();
}
if(FD_ISSET(pTalkDialog->m_CliTxSock,&WirteSocket))
{
pTalkDialog->m_TxFlag=TRUE;

}
}
Sleep(1);
}
return 0;
}

void CTalkDialog::OnSendTextBtn()
{
// TODO: 在此添加控件通知处理程序代码
if(m_TxFlag==TRUE)
{
//m_TxFlag=FALSE;
CString str;
GetDlgItem(IDC_SendEdit)->GetWindowText(str); //得到发送RICHEDIT中的文本!
USES_CONVERSION;
LPSTR lpText = W2A(str); //转化为 char* ==LPSTR

CTime time=CTime::GetCurrentTime();
CString Str_time=time.Format("%H:%M:%S");
Str_time+=" ";
Str_time+=str;
sendto(m_CliTxSock,lpText,strlen(lpText),0,(SOCKADDR*)&m_SendTxServInfo,sizeof(SOCKADDR));
GetDlgItem(IDC_SendEdit)->SetWindowTextW(L""); //点击发送后将发送文本框的内容消除!

CString Strall;
GetDlgItem(IDC_RecvEdit)->GetWindowText(Strall);// cstring==LPCTSTR;
Strall+=Str_time;
Strall+="\r\n"; //这样后,并不会换行,要设置RICHEDIT的属性Auto HScroll 设置为FALSE 、Multiline 设置为True
GetDlgItem(IDC_RecvEdit)->SetWindowText(Strall);
//}
}

void CTalkDialog::RecvText()
{
char RecvBuf[10000];
SOCKADDR_IN RecvTxCliInfo;
int len=sizeof(SOCKADDR);
recvfrom(m_ServTxSock,RecvBuf,10000,0,(SOCKADDR*)&RecvTxCliInfo,&len);

CTime time=CTime::GetCurrentTime();
CString Str_time=time.Format("%H:%M:%S");

CString str(Str_time);

str+=" ";
str+=RecvBuf;
str+="\r\n";

CString GetStr;
GetDlgItem(IDC_RecvEdit)->GetWindowText(GetStr);

GetStr+=str;
GetDlgItem(IDC_RecvEdit)->SetWindowText(GetStr);

}


TextOrFileSend()这是个线程函数,OnSendTextBtn()发送数据的函数,RecvText接收数据的函数,怎么SELECT返回一直是
-1请问一下原因!
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-11-24
  • 打赏
  • 举报
回复
WSAGetLastError()返回的值是什么看看不就清楚了
monk_CD 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnwyllmm 的回复:]

返回-1表示有错误,用WSAGetLastError看看返回什么错误
我没看到楼主的使用socket之类的函数创建套接字,不知道楼主的套接字怎么生成的
[/Quote]
我在Oninitdialog中初始化了客户端与服务端的SOCKET,因为我这个程序既是客户端又是服务端!
monk_CD 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hnwyllmm 的回复:]

Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_se……
[/Quote]

谢谢解决了! 朋友感谢你
羽飞 2011-11-24
  • 打赏
  • 举报
回复
Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
你的那个不是正确的套接字,你套作fd_set的方法不对
楼主上网查查怎么操作
羽飞 2011-11-24
  • 打赏
  • 举报
回复
返回-1表示有错误,用WSAGetLastError看看返回什么错误
我没看到楼主的使用socket之类的函数创建套接字,不知道楼主的套接字怎么生成的
monk_CD 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]

WSAGetLastError()返回的值是什么看看不就清楚了
[/Quote]

返回10038

18,356

社区成员

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

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