一段很简单的代码:#include <WinSock2.h>
#include <iostream>
using namespace std;#pragma comment(lib, "ws2_32.lib")#define  SERV_PORT 6000
#define  BACKLOG 3int main()
{
        SOCKET serv_socket  = INVALID_SOCKET;
        SOCKET new_socekt  = INVALID_SOCKET;
        WSADATA wsaData;
        struct sockaddr_in server, client;
        int err;
int sendlen; //the length of data sended
char buf[] = "Hello, welcom to my server!";
int serv_port = SERV_PORT;
     //*******initiates use of Ws2_32.dll****************
    
//err = WSAStartup(WINSOCK_VERSION,&wsaData);
err = WSAStartup(MAKEWORD(2,2),&wsaData);
//assert(err==0);
if (err != 0)
{
cout << "Failed to load Winsock.\n";
return 0;
} //*******Create Socket****************
     serv_socket = socket(AF_INET, SOCK_STREAM, 0);
 if (serv_socket == INVALID_SOCKET)
 {
 cout << "socket() failed, error code: " << WSAGetLastError() << endl;
 return 0;
 }  //*******server address****************
         memset((char *)&server, 0, sizeof(struct sockaddr_in));
         server.sin_family = AF_INET;
 server.sin_port = htons(SERV_PORT);
 server.sin_addr.s_addr = htonl(INADDR_ANY);
   //*******Bind Socket with server address****************
 err = bind(serv_socket, (struct sockaddr*)&server, sizeof(server));
 
 if (err = SOCKET_ERROR)
 {   
         cout << "bind() Failed, error code: " << WSAGetLastError() << endl;
 closesocket(serv_socket);
 WSACleanup();
 return 0;
 }以下可以省略了
VC2005下编译运行,始终是:bind() Failed, error code: 0也换过一些端口(1024以上的)。不知道错在哪里。

解决方案 »

  1.   


     if (err = SOCKET_ERROR) //错,err == SOCKET_ERROR
     {    
             cout  < < "bind() Failed, error code: "  < < WSAGetLastError()  < < endl; 
     closesocket(serv_socket); 
     WSACleanup(); 
     return 0; 
     } 
      

  2.   

    失败后用WSAGetLastError取出错误码查找原因。bind失败的常见原因是被防火墙阻止或者端口已经被占用。
      

  3.   

    if (err = SOCKET_ERROR) 
    这种写法,条件无论什么时候都会成立,判断相等要用==
    判断bind是否成功一般是判断返回值是否为0。
      

  4.   

     if (err = SOCKET_ERROR)    永远都BIND 失败
      

  5.   

    低级错误,以后用if (SOCKET_ERROR == err),因为如果写成if (SOCKET_ERROR = err),编译会报错.
      

  6.   

    果然是犯了个低级错误
    if (err = SOCKET_ERROR) //错,err == SOCKET_ERROR群众的眼光是雪亮的