基于UDP协议的socket编程,为什么服务器端一bind就无响应啊?

hust_19861 2010-10-19 10:01:13
下面是程序代码:sendBuf和recvBuf是数组,i,j是判断标识

我不加bind语句服务器运行没问题,当然这样不能实现网络通信,运行bind程序后就无响应,调试显示bind返回值为0,绑定是成功的!!怎么回事啊!!!!高手解答啊!

void CSocketDlg::OnAccept()
{
wVERSION=MAKEWORD(2,2);
err=WSAStartup(wVERSION,&wsaData);
if(err!=0)
{
MessageBox("错误","ERROR",MB_OK);
}
if (LOBYTE(wsaData.wVersion) !=2||HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
}

socksrv=socket(AF_INET,SOCK_DGRAM,0);

if(socksrv==INVALID_SOCKET){MessageBox("The Initcial of socket is error","ERROR",MB_OK);}

addrsrv.sin_family=AF_INET;
addrsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrsrv.sin_port=htons(6802);

bind(socksrv,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR));
len=sizeof(SOCKADDR);

SetTimer(1,1000,NULL);
}

void CSocketDlg::OnTimer(UINT nIDEvent)
{

if( recvfrom(socksrv,recvBuf,100,0,(SOCKADDR*)&addrclient,&len)>0){ i=1;Display();}
if(j==1){sendto(socksrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrclient,len);Display();}


CDialog::OnTimer(nIDEvent);
}
...全文
325 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ling_ke 2012-10-28
  • 打赏
  • 举报
回复
socksrv=socket(AF_INET,SOCK_DGRAM,0);
最后一个参数错了。0用于IP,UDP不用这个。
hust_19861 2010-10-19
  • 打赏
  • 举报
回复
如何用 u_long iMode = 1;
ioctlsocket(socksrv, FIONBIO, &iMode);
把阻塞模式改为非阻塞模式,为什么也不成呢?
hust_19861 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
引用 5 楼 hust_19861 的回复:
引用 1 楼 visualeleven 的回复:
你说的程序无响应,应该是阻塞在recvfrom函数中了吧。。。


要怎么解决啊?我觉得也是阻塞在这了,但是不知道怎么解决,帮忙一下吧!


引用 1 楼 visualeleven 的回复:
bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfro……
[/Quote]

是卡死了,那我搞下线程试试!
Eleven 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hust_19861 的回复:]
引用 1 楼 visualeleven 的回复:
你说的程序无响应,应该是阻塞在recvfrom函数中了吧。。。


要怎么解决啊?我觉得也是阻塞在这了,但是不知道怎么解决,帮忙一下吧!


引用 1 楼 visualeleven 的回复:
bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfrom才能收到啊

建议看看孙鑫的vc视频教程
……
[/Quote]
这个很容易发现问题啊,你在recvfrom的地方打个断点,Debug下F5,看看程序是否在这里阻塞了不就清楚了。
一般的话是放在一个单独的线程中去recvfrom接收数据,这样不至于把界面卡死
Chivalry 2010-10-19
  • 打赏
  • 举报
回复
if( recvfrom(socksrv,recvBuf,100,0,(SOCKADDR*)&addrclient,&len)>0){ i=1;Display();}
if(j==1){sendto(socksrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrclient,len);Display();}

这个地方recv和sendto顺序是不是反了啊
Chivalry 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jimoguilai 的回复:]
bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfrom才能收到啊

建议看看孙鑫的vc视频教程
[/Quote]

这个地方我说错了,需要listen的应该是TCP吧
UDP不需要?这个我也不太清楚,我看了一下TCP的,是需要listen的
hust_19861 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
你说的程序无响应,应该是阻塞在recvfrom函数中了吧。。。
[/Quote]

要怎么解决啊?我觉得也是阻塞在这了,但是不知道怎么解决,帮忙一下吧!

[Quote=引用 1 楼 visualeleven 的回复:]
bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfrom才能收到啊

建议看看孙鑫的vc视频教程
[/Quote]
基于UDP的不用listen啊,孙鑫的看过了!
Chivalry 2010-10-19
  • 打赏
  • 举报
回复
UdpClient.cpp

#include <Winsock2.h>
#include <stdio.h>

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( );
return;
}

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
Chivalry 2010-10-19
  • 打赏
  • 举报
回复
UdpSrv.cpp

#include <Winsock2.h>
#include <stdio.h>

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( );
return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
Chivalry 2010-10-19
  • 打赏
  • 举报
回复
bind之后要listen啊,当有连接到来的时候,你再给他发送数据,然后你那边的recvfrom才能收到啊

建议看看孙鑫的vc视频教程
Eleven 2010-10-19
  • 打赏
  • 举报
回复
你说的程序无响应,应该是阻塞在recvfrom函数中了吧。。。

18,356

社区成员

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

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