SOCKET s=socket(AF_INET, SOCK_STREAM, 0);
int rc = 0;
sockaddr_in server;
server.sin_port = htons(80);
server.sin_family = AF_INET;
server.sin_addr.S_un.S_addr = INADDR_ANY;
rc = bind(s, (struct sockaddr *)&server, sizeof(server));每次RC返回都是-1,BIND失败,为什么??

解决方案 »

  1.   

    你的ip地址应该是本机的ip地址.
      

  2.   

    ip地址无所谓,用GetLastError()看看什么错
      

  3.   

    我用WSAGetLastError();
    他说是
    在一个非套接字上尝试了一个操作。 
    不懂……
      

  4.   

    1,看看s值对不对,
    2,把server结构初始化一下
      

  5.   

    确保 WSAStartup, socket 函数调用成功:)你调用 WSAStartup 没?socket 的返回值检测一下, 是不是 INVALID_SOCKET
      

  6.   

    s的值为4294967295
    什么叫对不对呢?
    server我不是已经结构初始化过了吗?
      

  7.   

    s 确实是等于INVALID_SOCKET!
    靠,那那句SOCKET s=socket(AF_INET, SOCK_STREAM, 0);该怎么写?我WSAStartup 已经加上了
      

  8.   

    还有我的头文件是用#include <afxsock.h>
    如果用#include <winsock.h>就会有连接错误~
    为什么??
      

  9.   

    INVALID_SOCKET -> 无效的套接字描述符. 说明 socket 调用不成功. 看你的: s=socket(AF_INET, SOCK_STREAM, 0); 这句是没有错误的. 我看问题出现在 WSAStartup 上, 简测一下返回值, 如果是 SOCKET_ERROR 就表示没成功. WSADATA data;
    WSAStartup(MAKEWORD(2, 2), &data);像上面那样调用 WSAStartup 应该没问题. // 这样包含吧, 别用 afxsock.h
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
      

  10.   

    server.sin_addr.S_un.S_addr = INADDR_ANY;你把这句改为:
    server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);应该就没问题了,
    INADDR_ANY是网络序列应改为主机序列;
      

  11.   

    server.sin_addr.S_un.S_addr = INADDR_ANY;你把这句改为:
    server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);应该就没问题了,
    INADDR_ANY是"主机序列"应改为"网络序列";SORRY,刚才写反了:)
      

  12.   

    WSADATA data;
    int Status = WSAStartup(MAKEWORD(2, 2), &data);
    if(Status == SOCKET_ERROR)
    return 0; SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
    {
    return 0;
    }
    int rc = 0; sockaddr_in server;
    server.sin_port = htons(1028);
    server.sin_family = AF_INET;
    server.sin_addr.S_un.S_addr = htonl(INADDR_ANY); rc = bind(s, (LPSOCKADDR)&server, sizeof(server));
    int a = WSAGetLastError();
    if(rc = SOCKET_ERROR)
    {
    AfxMessageBox("bind 失败");
    return 0;
    }
    这次用WSAGetLastError();问题变成
    通常每个套接字地址 (协议/网络地址/端口) 只允许使用一次。
      

  13.   

    一些常用端口已被使用,如果你不声明端口可以重复使用,bind当然会失败
      

  14.   

    或者,你可以定一个初始值,用while循环,每次不成功,则此值加一作为端口号,直到成功为止
      

  15.   

    或者用
        bFlag = TRUE;setsockopt(Socket,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag)) 来定义端口可以重复使用。 
      

  16.   

    ok,解决了!
    是端口被占用了
    我改成server.sin_port = 0;
    就好了