recvfrom重复接收的问题?

xdyuqun 2011-05-08 03:31:54
在没有数据接收的情况下,recvfrom总是接收0.0.0.0 say:。不明白为什么。

recvfrom

void main(){
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested =MAKEWORD(1,1);
err =WSAStartup(wVersionRequested,&wsaData);
if(err!=0){return ;}
if( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) !=1 )
{
WSACleanup();
}

SOCKADDR_IN addrClient;
SOCKADDR_IN addSrv;
SOCKET sockSrv;

sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(5000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));

DWORD WINAPI FunProc1( LPVOID lpParameter);
DWORD WINAPI FunProc2( LPVOID lpParameter);
HANDLE hthread1,hthread2;
hthread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
hthread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);

CloseHandle(hthread1);
CloseHandle(hthread2);
closesocket(sockSrv);
WSACleanup();
}
DWORD WINAPI FunProc1(LPVOID lpParameter)//接收
{
char recvBuf[100]="";
char buffer[15];
int len=sizeof(SOCKADDR);
while(1)
{recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); //当客户端没有给服务端发送端发送数据时,
// 重复接收“0.0.0.0 say:”

if('q'==recvBuf[0])
{
sendto(sockSrv,"q",strlen("q")+1,0,(sockaddr*)&addrClient,len);
//sprintf(buffer,"%s","Char end!\n");
break;
}
sprintf(tempBuf,"%s say: %s",inet_ntoa(addrClient.sin_addr),recvBuf);
::SetDlgItemText(handle,IDC_EDIT2,tempBuf);
}
return 0;
}
DWORD WINAPI FunProc2(LPVOID lpParameter)//发送,应该没错
{
char str[200]="";int len=sizeof(SOCKADDR);

while(1)
{
if (press==TRUE)
{
::GetDlgItemText(handle,IDC_EDIT1,str,200);
::SetDlgItemText(handle,IDC_EDIT1,"");

sendto(sockSrv,str,strlen(str)+1,0,(sockaddr*)&addrClient,len);
::SetDlgItemText(handle,IDC_EDIT2,str);


press=false;
}
}
return 0;
...全文
328 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2011-05-08
  • 打赏
  • 举报
回复
重复接收指收了多少次?把sendto注释掉
Eleven 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xdyuqun 的回复:]
并且我在创建线程后加了个Sleep(1000000);主线程是不会结束掉的。
[/Quote]
囧,你贴代码也贴完整嘛?关键的地方不贴,你检查一下recvfrom是否调用成功?
xdyuqun 2011-05-08
  • 打赏
  • 举报
回复
并且我在创建线程后加了个Sleep(1000000);主线程是不会结束掉的。
xdyuqun 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
recvfrom()正常的话应该是阻塞的,这里应该是你的recvfrom调用失败了。
另外你的主线程中创建工作线程以后,并没有等待工作线程的操作WaitForMultipleObject(),主线程
hthread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
hthread2=CreateThread(NULL,0,FunProc2,NULL,0……
[/Quote]
我的两个工作线程一个是接收数据,一个发送数据,没有共同的访问变量,不需要用WaitForMultipleObject同步吧。recvfrom为什么会调用失败呢。求教中
King_hhuang 2011-05-08
  • 打赏
  • 举报
回复
你少了accept这一步
Eleven 2011-05-08
  • 打赏
  • 举报
回复
recvfrom()正常的话应该是阻塞的,这里应该是你的recvfrom调用失败了。
另外你的主线程中创建工作线程以后,并没有等待工作线程的操作WaitForMultipleObject(),主线程
hthread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
hthread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);

CloseHandle(hthread1);
CloseHandle(hthread2);
closesocket(sockSrv);
WSACleanup();
这样的话,你的sockSrv就无效了,你的工作线程没有结束掉吗?

18,356

社区成员

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

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