socket的UDP方式bind出错

hyzkui 2010-02-09 04:22:14
mCallSocket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==mCallSocket)
{
bRet=FALSE;
}
else
{
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(nCallSocketPort);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
if(SOCKET_ERROR==bind(mSocket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
closesocket(mSocket);
bRet=FALSE;
}
else
bRet=TRUE;
}
Debug调试运行,跟踪到bind时出现内存访问错:(msvcr90d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x000408bc 时发生访问冲突

请问这是什么原因,我在另一台电脑运行正常,在Release方式下运行也正常的
...全文
767 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Conry 2010-02-09
  • 打赏
  • 举报
回复
单就这些看不出什么问题,也许是你调用这个函数或者说调用你这段代码的地方存在内存越界,
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
我调试了楼主的程序,没什么问题啊!有问题的话楼主好了的话,把分给我哈!哈哈
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
AfxSocketInit()算不算?

cnlm2 2010-02-09
  • 打赏
  • 举报
回复
你的程序肯定是没有WSAStartup
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include "winsock2.h"

void main() {
//----------------------
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");

//----------------------
// Create a SOCKET for listening for
// incoming connection requests
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);

//----------------------
// Bind the socket.
if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ListenSocket);
return;
}

WSACleanup();
return;
}

msdn上的例子

你的在bind那里出错,看下bind函数的返回值是什么,msdn上有出错的原因!
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
能正常生成,但运行时就出错.就是在bind时
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
引用 11 楼 cnlm2 的回复:
MFC 的话好像有个afx啥的,也是初始化的!

这个怕不用你说哟,呵呵
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
MFC 的话好像有个afx啥的,也是初始化的!
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
引用 8 楼 cnlm2 的回复:
最好学会自己调试看断点再哪一步,然后查MSDN,这样可能会很快自己找出问题!

这个我会的,但出现这个问题,找不到原因
Icedmilk 2010-02-09
  • 打赏
  • 举报
回复
..mfc程序与win32程序本质上是一样的

更何况你写网络这块用的也不是mfc的东西,
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
最好学会自己调试看断点再哪一步,然后查MSDN,这样可能会很快自己找出问题!
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
引用 5 楼 cnlm2 的回复:
win32平台下的?
如果是win32下的那就要

WSADATA ws;
WORD wVersion;
wVersion = MAKEWORD( 1, 1 );
int iRet = WSAStartup(wVersion, &ws);
if (iRet)
{
  std::cout < < "初始化失败" < < std::endl;
  return false;
}

祝好运!

我是MFC程序,应该不是这个原因吧
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
结尾还得加
WSACleanup( );
cnlm2 2010-02-09
  • 打赏
  • 举报
回复
win32平台下的?
如果是win32下的那就要

WSADATA ws;
WORD wVersion;
wVersion = MAKEWORD( 1, 1 );
int iRet = WSAStartup(wVersion, &ws);
if (iRet)
{
std::cout << "初始化失败" << std::endl;
return false;
}

祝好运!
hyzkui 2010-02-09
  • 打赏
  • 举报
回复
bool bRet;
//SOCKET mSocket;
try
{
mCallSocket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==mCallSocket)
{
bRet=FALSE;
}
else
{
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(nCallSocketPort);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
if(SOCKET_ERROR==bind(mCallSocket,(SOCKADDR*)&addrSock,sizeof(addrSock)))
{
closesocket(mCallSocket);
bRet=FALSE;
}
else
bRet=TRUE;
}
}
catch(CException *ce)
{
bRet=false;
delete ce;
}
return bRet;

现在的代码是上面这样的,还是报那种内存访问冲突错误
WizardK 2010-02-09
  • 打赏
  • 举报
回复
以后直接sizeof(addrSock)就不会出错了
Icedmilk 2010-02-09
  • 打赏
  • 举报
回复
你bind的socket不是你创建的那个

mCallSocket

mSocket

整个visual assistx吧
M_S_D_N 2010-02-09
  • 打赏
  • 举报
回复
if(SOCKET_ERROR==bind(mSocket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR_IN)))

18,356

社区成员

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

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