代码如下:
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0){
MessageBox("winsock initial error!");
return;
}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
WSACleanup();
MessageBox("winsock clean up!");
return;
}

SOCKET sockfd;
struct sockaddr_in addrin;if(sockfd=socket(AF_INET,SOCK_DGRAM,0)==INVALID_SOCKET){
MessageBox("can't open socket!");
return;
}memset((char *)&addrin,0,sizeof(addrin));
addrin.sin_family        = AF_INET;
addrin.sin_addr.s_addr   = inet_addr(m_serverIP_str);
addrin.sin_port          = htons(6000);if(bind(sockfd,(struct sockaddr *)&addrin,sizeof(addrin))==SOCKET_ERROR){
int error=GetLastError();
CString mm;
mm.Format("bind error,ID %d",error);
MessageBox(mm);
return;
}char *msg="hello,socket!";
sendto(sockfd,msg,sizeof(msg),0,(struct sockaddr *)&addrin,sizeof(addrin));
.
.
.
执行的时候每次都报bind错误,由WSAGetLastError返回的错误代码为10038,经查意义如下:“
WSAENOTSOCK     (10038)     Socket operation on non-socket.
操作试图不是在套接字上进行。它可能是套接字句柄参数没有引用到一个合法套接字,或者是调用select()函数时,一个fd_set中的成员不合法。

本人实在搞不懂哪里有不对的地方,希望知道的朋友指点一二!感谢!

解决方案 »

  1.   

    addrin.sin_addr.s_addr   = inet_addr(m_serverIP_str);
    改为addrin.sin_addr.S_un.S_addr = inet_addr(m_serverIP_str);另外,UDP好像不需要指定port,反正我没有指定。
      

  2.   

    偶知道了
    上述代码中
    if(sockfd=socket(AF_INET,SOCK_DGRAM,0)==INVALID_SOCKET){
    一行改为
    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET){
    少个括号而已,faint~!!!分自己拿了!
      

  3.   

    to broadoceans:winsock2.h中316行有如下定义:(VC6所带的库)
        #define s_addr  S_un.S_addr    
    :-)
    另,UDP不需要指定端口?可否详述?
      

  4.   

    to:zhaolaoxin() 
    偶这个是需要bind的:-)谢谢楼上两位热心朋友!
      

  5.   

    UDP可以bind也可以不bind,随自己需要
      

  6.   

    TCP 和UDP 都可以不 bind, 对于TCP 如果不 bind 的话能 connect到对方,能accept对方,而不能listen。 UDP 不 bind 的话不能recvfrom,能 sendto
      

  7.   

    你的IP前面要加上!htonl(IP)!htons(PORT)ip必须是网络字节序!你试试!100%是这个问题呵呵
      

  8.   

    UDP不需要指定端口?可否详述?应该指定端口,由于我的是icmp协议,可以不指定端口,
    指定了也被忽略