还是socket api的udp问题,继续文

mzy2003 2006-12-07 05:05:26
用如下语句创建socket
CMyUdpSocket是自己创建的类
SOCKET m_Socket;
CString m_Ip;//m_Ip="127.0.0.1"
int m_Port;//m_Port=1092
是类变量
int CMyUdpSocket::Create()//
{
// BOOL ret=TRUE,ret1=TRUE,bNoBlock=TRUE;
//struct sockaddr_in myAddr;
int myUdpSock = 0;

//memset((char *)&myAddr,0, sizeof(struct sockaddr_in));

myUdpSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//0);
if (myUdpSock == INVALID_SOCKET)
{
TRACE("failed when create my udp socket!port:%d\n",m_Port);

return -2;
}
m_hSocket=myUdpSock;
}

int CMyUdpSocket::SendTo(void *lpBuf, int nSize)
{
int nSend=SOCKET_ERROR;
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
int tolen=sizeof(struct sockaddr_in);
addr.sin_addr.s_addr = inet_addr(m_Ip);
addr.sin_port=htons(m_Port);

nSend=sendto(m_hSocket,(char*)lpBuf,nSize,0,(struct sockaddr*)&addr,tolen);
if(nSend==SOCKET_ERROR)
m_bSockException=TRUE;
else
m_bSockException=FALSE;
return nSend;
}

使用这里的SendTo函数总出10047错误。

为了测试,又从CSocket继承了个类CUdpSocket
使用如下代码就没问题
CUdpSocket usk;
BOOL bErr=usk.Create(0,SOCK_DGRAM);
if (!bErr) return;
BOOL val=TRUE;
char lpBuf[21]="01234567890123456789";

int nErr=usk.SendTo(lpBuf,21,1092,"127.0.0.1");
if (SOCKET_ERROR==nErr)
{
nErr=WSAGetLastError();
TRACE("err:%d\n",nErr);
}
usk.Close();
usk.ShutDown();
请高手看下CMyUdpSocket的SendTo函数有什么问题?


...全文
232 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrameMan 2006-12-09
  • 打赏
  • 举报
回复
int CMyUdpSocket::SendTo(void *lpBuf, int nSize)
{
int nSend=SOCKET_ERROR;
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
int tolen=sizeof(struct sockaddr_in);
addr.sin_addr.s_addr = inet_addr(m_Ip);
addr.sin_port=htons(m_Port);
addr.sin_family = AF_INET;

nSend=sendto(m_hSocket,(char*)lpBuf,nSize,0,(struct sockaddr*)&addr,tolen);
if(nSend==SOCKET_ERROR)
m_bSockException=TRUE;
else
m_bSockException=FALSE;
return nSend;
}



blastzgd 2006-12-09
  • 打赏
  • 举报
回复
我没在网络模块使用过CString.
所以建议使用inet_addr后测试一下addr.sin_addr.s_addr的值是否正确.

if(INADDR_NONE == addr.sin_addr.s_addr)
报错();

如果出错.将参数转换成char*类型就可以了.
Elysium 2006-12-08
  • 打赏
  • 举报
回复
VC下基于消息机制的UDP连接实现
http://blog.csdn.net/elysium
neosu 2006-12-07
  • 打赏
  • 举报
回复
我一般这样用, 参考一下

sockaddr_in addr;
ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(nPort);

unsigned long nAddress = inet_addr(strIPAddress);
//如果是域名, 这里要进行解析. 些处省略.
addr.sin_addr.S_un.S_addr = nAddress;
neosu 2006-12-07
  • 打赏
  • 举报
回复
Socket error 10047 - Address family not supported by protocol family
你的m_Ip和m_Port是多少?
mzy2003 2006-12-07
  • 打赏
  • 举报
回复
注:CMyUdpSocket的变量m_Ip,m_Port都正确赋值了

18,357

社区成员

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

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