用如下语句创建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函数有什么问题?

解决方案 »

  1.   

    注:CMyUdpSocket的变量m_Ip,m_Port都正确赋值了
      

  2.   

    Socket error 10047 - Address family not supported by protocol family 
    你的m_Ip和m_Port是多少?
      

  3.   

    我一般这样用, 参考一下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;
      

  4.   

    VC下基于消息机制的UDP连接实现
    http://blog.csdn.net/elysium
      

  5.   

    我没在网络模块使用过CString.
    所以建议使用inet_addr后测试一下addr.sin_addr.s_addr的值是否正确.if(INADDR_NONE == addr.sin_addr.s_addr)
       报错();如果出错.将参数转换成char*类型就可以了.
      

  6.   

    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;
    }