初次网络编程,编了一个小小的程序,代码如下:#include<winsock2.h>
#include<stdio.h>
void main(void)
{
WSADATA wsaData;
//初始化版本
int Ret=WSAStartup(MAKEWORD(2,2),&wsaData);
if(Ret!=0)
{
printf("WSAStartup failed with error %d\n",Ret);
return;
} if(WSACleanup()==SOCKET_ERROR)
{
printf("WSACleanup failed with error %d\n",WSAGetLastError());
}
else printf("establish successful!\n");
SOCKADDR_IN InternetAddr;
INT nPortId=5150;
InternetAddr.sin_family=AF_INET;
InternetAddr.sin_addr.s_addr=inet_addr("172.29.26.227");//如何将这个IP 输出呢?用printf怎样输出呢? InternetAddr.sin_port=htons(nPortId);
SOCKET s;
SOCKADDR_IN tcpaddr;
int port = 5150;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
tcpaddr.sin_family=AF_INET;
tcpaddr.sin_port=htons(port);
tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if((bind(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr)))==SOCKET_ERROR)
printf("bind failed!\n");
}
程序运行结果:
establish successful!
bind failed!
Press any key to continue
为什么会绑定不成功返回SOCKET_ERROR呢?
请高手指点~~

解决方案 »

  1.   

    5150端口被其他Application已经bind了,要改变一下了。
      

  2.   

    问题1: 
    去掉这段代码
    if(WSACleanup()==SOCKET_ERROR) 

    printf("WSACleanup failed with error %d\n",WSAGetLastError()); 
    } 问题2 
    printf("%s","172.29.26.227\n");
      

  3.   

    虽然你用socketaddr_in,但是你还是要给它个sizeof(SOCKETADDR);
        bind(socketudpsrv,(SOCKADDR*)&addrsrv,sizefo(SOCKETADDR););
      

  4.   

    被你忽悠了。。
    MSDN:
    Return Values
    If no error occurs, bind returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved by calling WSAGetLastError.你已经正常bind了。
      

  5.   

    if(WSACleanup()==SOCKET_ERROR) 
    这句去掉
      

  6.   

    不是啊,我没有正常bind啊。如果没有错误的话,会返回0的。而if语句不是直接把这个作为参数的,所以应该没有错误吧~~
      

  7.   

    我将代码按照大家说的进行了修改,改后的代码如下:
    #include<winsock2.h>
    #include<stdio.h>
    void main(void)
    {
    WSADATA wsaData;
    //初始化版本
    int Ret=WSAStartup(MAKEWORD(2,2),&wsaData);
    if(Ret!=0)
    {
    printf("WSAStartup failed with error %d\n",Ret);
    return;
    } /*if(WSACleanup()==SOCKET_ERROR)
    {
    printf("WSACleanup failed with error %d\n",WSAGetLastError());
    }
    else printf("establish successful!\n");*/
    SOCKADDR_IN InternetAddr;
    INT nPortId=5150;
    InternetAddr.sin_family=AF_INET;
    InternetAddr.sin_addr.s_addr=inet_addr("172.29.26.227");
    InternetAddr.sin_port=htons(nPortId);
    //printf("%s",InternetAddr.sin_addr.s_addr); 
    SOCKET s;
    SOCKADDR_IN tcpaddr;
    int port = 1000555;
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(s=0)
    printf("setup socket error!");
    tcpaddr.sin_family=AF_INET;
    tcpaddr.sin_port=htons(port);
    tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    bind(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr));
    if((bind(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr)))==SOCKET_ERROR)
    printf("bind failed!\n");
    else printf("bind successful!");
    }
    端口试了好几次了,但是都不行,运行结果如下:
    bind failed!
    Press any key to continue
    而且,我将语句printf("%s",InternetAddr.sin_addr.s_addr); 加入,则程序出现错误,强制退出。请大家指点一下啊~~~
      

  8.   

    1 我这边bind已经成功了。你bind不成功,可能是因为那个端口被占用。
    2 InternetAddr.sin_addr.s_addr 并不是字符串类型,直接按字符串处理。程序肯定会异常退出。
      printf("%s\n", inet_ntoa(InternetAddr.sin_addr.s_addr));
      

  9.   

    WSAGetLastError看看错误是什么原因
      

  10.   

    #include <winsock2.h> 
    #include <stdio.h> 
    void main(void) 

    WSADATA wsaData; 
    //初始化版本 
    int Ret=WSAStartup(MAKEWORD(2,2),&wsaData); 
    if(Ret!=0) 

    printf("WSAStartup failed with error %d\n",Ret); 
    return; 
    } /*if(WSACleanup()==SOCKET_ERROR) 

    printf("WSACleanup failed with error %d\n",WSAGetLastError()); 

    else printf("establish successful!\n");*/ 
    SOCKADDR_IN InternetAddr; 
    INT nPortId=5150; 
    InternetAddr.sin_family=AF_INET; 
    InternetAddr.sin_addr.s_addr=inet_addr("172.29.26.227"); 
    InternetAddr.sin_port=htons(nPortId); 
    //printf("%s",InternetAddr.sin_addr.s_addr); 
    SOCKET s; 
    SOCKADDR_IN tcpaddr; 
    int port = 1000555; 
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(s=0) 
    printf("setup socket error!"); 
    tcpaddr.sin_family=AF_INET; 
    tcpaddr.sin_port=htons(port); 
    tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY); 
    bind(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr)); 
    if((bind(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr)))==SOCKET_ERROR)
     
    printf("bind failed!\n"); 
    else printf("bind successful!"); 
    } bind了2次当然会失败
      

  11.   

    int port = 1000555; 
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(s=0
    printf("setup socket error!"); 
    tcpaddr.sin_family=AF_INET; 
    tcpaddr.sin_port=htons(port); 
    tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY); 套接字被你改了!!当然也会bind失败!
      

  12.   

    改正之后就ok了,我这里调试bind成功了