奇怪的问题,运行下列程序后,sendto返回-1,调用WSAGetLastError后,返回WSAEAFNOSUPPORT.不懂这个错误的意思,请问大虾到底问题出在那里?谢谢 struct hostent *phe;
struct sockaddr_in sin;
SOCKET sock; memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=40800;
if (phe=gethostbyname("127.0.0.1"))
memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);
else if ((sin.sin_addr.s_addr=inet_addr("127.0.0.1"))==INADDR_NONE)
NewException("Failed to get host entry.",CXEXP_NET);

if ((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET)
NewException("Failed to create socket.",CXEXP_NET);
if (connect(sock,(sockaddr*)&sin,sizeof(sin))<0)
NewException("Failed to connect.",CXEXP_NET); int r;
DWORD data;

r=sendto(sock,(char*)&data,sizeof(data),0,(sockaddr*)&sin.sin_addr,sizeof(sockaddr_in));
r=WSAGetLastError();

解决方案 »

  1.   

    UDP不调用connect函数,使用bind函数
      

  2.   

    bind绑定本机地址,sendto的addr参数需要设成对方地址
      

  3.   

    是因为Address family不对,怎么前后矛盾?
    你看看:sin.sin_family=AF_INET;
    而socket(PF_INET,应该都设成AF_INET
      

  4.   

    sin.sin_port=40800;
    为sin.sin_port = htons(40800)
      

  5.   

    Error code WSAEPFNOSUPPORT means:The protocol family has not been configured into the system or no implementation for it exists. This message has a slightly different meaning from WSAEAFNOSUPPORT. However, it is interchangeable in most cases, and all Windows Sockets functions that return one of these messages also specifyWSAEAFNOSUPPORT. Example codes:int socket_handle;
    struct sockaddr_in client_addr;
    if ((socket_handle = socket(PF_INET, SOCK_DGRAM)) < 0) 
    {
    /* error handler */ 
    }
    memset((char *) &client_addr, 0, sizeof(client_addr));
    client_addr.sin_family = PF_INET;
    client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    client_addr.sin_port = htons(0); /* let the OS select */
    if (bind(socket_handle, (struct sockaddr *)&client_addr,sizeof(client_addr) < 0) {
    /* error handler */ 

      

  6.   

    sin.sin_port=40800;
    为sin.sin_port = htons(40800)
      

  7.   

    在winsock2里AF_INET和PF_INET是一样的
    sin.sin_port=40800实际绑定的端口是24735,原因见楼上  lichungen(阿根) 所言memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);这一句话在做什么?
      

  8.   

    楼主可能以前一直做TCP,但UDP的使用方法和TCP不同!
    socket();bind();sendto();
    不能connect
      

  9.   

    UDP协议可以调用bind和connect函数,但是如果使用连接的UDP协议,必须使用send和recv这两个函数进行发送和接受,不能使用sendto和recvfrom函数,因为sendto和recvfrom是面向无连接的,所以不能调用bind和connect
      

  10.   

    问题终于解决了。connect是可以用的(本质就是隐式调用bind),我是看 Internetworking with TCP/IP volume 3的sample写的。htons()没用是一个错误,但是之所以返回WSAEAFNOSUPPORT的问题关键是r=sendto(sock,(char*)&data,sizeof(data),0,(sockaddr*)&sin.sin_addr,sizeof(sockaddr_in))这句话错了,我太粗心了,应该把(sockaddr*)&sin.sin_addr改为(sockaddr*)&sin就OK了。:)To alanwang, memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);的意思就是把gethostbyname得到的地址拷贝给sin.sin_addrTo qitengyi, 在Connection-oriented的UDP中好像不能用send和recv的吧。我在SDK和书中看到的都说只能在TCP下用。P.S. 我以前用DirectPlay写网络游戏,差点没被气死,很不爽。这次索性用winsock自己做一个类似的DirectPlay,可控性和移植性都强一些。谢谢各位。