#include<stdio.h>
#include<windows.h>WSADATA wsadata;
SOCKET server;
SOCKET client;
sockaddr_in local;
sockaddr_in remote;int main()
{
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
printf("WSAStartup failed\n");
return 0;
}
if(server=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET)
{
printf("socket failed\n");
return 0;
} local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(u_short(24)); if(int n=bind(server,(struct sockaddr *)&local,sizeof(local))!=0)
{
printf("bing failed\n%d\n",n);
return 0;
}
printf("succeed\n");
return 0;
}
程序如上!
程序运行时,bing的返回值为1!
端口换过了,没有用!不知道究竟怎么回事了!
请大家帮帮忙!小弟这里先谢过了。

解决方案 »

  1.   


    local.sin_addr.s_addr = htonl(INADDR_ANY); 
      

  2.   

    local.sin_addr.s_addr = htonl(INADDR_ANY);
    另外,24端口是保留端口啊
      

  3.   

    WSAGetLastError看下Error code 
      

  4.   

    因为下面代码错误!
    首先,从来没见过在if中这么定义一个变量的,你觉得int n放这合适么?
    其次,=的优先级最低,你实际给n里赋值的是下面表达式的值,因此一旦bind返回的不是0,n就是1,不管对不对,我估计这不是你设计的原意bind(server,(struct sockaddr *)&local,sizeof(local))!=0
    if(int n=bind(server,(struct sockaddr *)&local,sizeof(local))!=0) 
      

  5.   

    INADDR_ANY是0,加不加这个没影响
      

  6.   

    还有一个就是bind是不会返回真正的错误码的,失败了顶多返回一个SOCKET_ERROR,因此你打印n也是毫无意义的。遇到错误还是需要WSAGetLastError得到错误码
      

  7.   

    噢,我纠正了那个错误了
    int n=bind(server,(struct sockaddr *)&local,sizeof(local));
    if(n!=0)
    {
    printf("bing failed\n%d\n",n);
    return 0;
    }
    但这是返回值n=-1了....
      

  8.   


    本来出错的时候返回值就是-1(SOCKET_ERROR),不可能返回你说的1。
    if(n!=0)写成if (n == SOCKET_ERROR)更确切些。
    你BIND了系统保留的24端口。如果换端口还不行,WSAGetLastError看下Error code。
      

  9.   

    我换了333端口了,还是不行。WSAGetLastError怎样用呢?我没用过。
    printf("bing failed\n%d\n",WSAGetLastError);
    这样吗?
      

  10.   

    333也是保留的,由IANA保留的端口范围:0~1023你换一个大点的,5000
      

  11.   


    是的,但是你的WSAGetLastError后面丢了()
      

  12.   

    10038:无效套接字上的套接字操作。if(server=socket(AF_INET,SOCK_STREAM,0)==INVALID_SOCKET)
    这行写的不对
    if((server=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)