我在本机上写了客户端和服务器的程序,测试可以连接和接收数据,而在两台局域网内,当客户端输入主机IP时
却说连接出错
代码如下:
server端:
int status;
sockServ = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addSrv;
//htonl将一个u_long类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addSrv.sin_family = AF_INET;
//htons将一个u_short类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_port = htons(9741); status = bind(sockServ,(SOCKADDR *)&addSrv,sizeof(SOCKADDR));
if(status !=0)
return FALSE;
    //将套接字设为监听模式
status = listen(sockServ,5);
if(status !=0)
return FALSE;
client端:
int msgsock;
sockClient = socket(AF_INET,SOCK_STREAM,0);
if (sockClient < 0)
{
MessageBox(0,"scoker err",
"err",MB_OK);
return FALSE;
}
SOCKADDR_IN addrServ;
addrServ.sin_addr.S_un.S_addr = inet_addr("192.168.1.6");//服务器端IP地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(9741);
//向服务器发送请求
msgsock=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
    if (msgsock!=0) {
MessageBox(0,"connect err",
"not lind",MB_OK);我想问问大家这是什么原因???我把防火墙都关了,是不是端口的问题?

解决方案 »

  1.   

    代码没问题,看看是否能ping通。
      

  2.   

    好的
    服务器端accept: SOCKADDR_IN addClient;
    int len = sizeof(SOCKADDR);
    try
    {
    //while (1) {
    //等待客户请求到来
    sockConn = accept(sockServ,(SOCKADDR *)&addClient,&len);
    if(sockConn<0)
    {
    closesocket(sockServ);
    return FALSE;
    }
      

  3.   

    呵呵如果连接不上返回的是SOCKET_ERROR(-1)
    服务器端刚开始监听就被你关掉了,仔细看一下下面的代码,和你的比较比较,这是sdk文档里的代码
    SOCKET AcceptSocket;    printf( "Waiting for a client to connect...\n" );
        while (1) {
            AcceptSocket = SOCKET_ERROR;
            while ( AcceptSocket == SOCKET_ERROR ) {
                AcceptSocket = accept( m_socket, NULL, NULL );
            }
            printf( "Client Connected.\n");
            m_socket = AcceptSocket; 
            break;
        }
      

  4.   

    不是的,我在服务器端是循环监听的SOCKET sock = ((RECVPARAM *)lpParameter)->threadSock;
    HWND   hwnd  = ((RECVPARAM *)lpParameter)->threadHwnd;
    delete lpParameter;
    while (true) 
    {

    if(!AcceptData())//在这里调用accept
    {
    WSACleanup();
    exit(1);
    }
    if (!GetData(tempHwnd)) 
    {
    if(!InitSock())
    return 0;
    if(!Accept())//这里是调用listen监听的,
    return 0;
    }
    closesocket(sockConn);
    }
    return 0;
      

  5.   

     sockConn    =    accept(sockServ,(SOCKADDR *)&addClient,&len);
        if(sockConn<0)
        {
            closesocket(sockServ);
            return FALSE;
        }
    比如你第一次进入监听状态,外部没有给它发送连接请求,这时候返回的是-1你的程序关闭了sockServ
    你是循环监听第二次程序又进入了accept状态,可是这时候sockServ已经被你关闭了你再  accept(sockServ,(SOCKADDR *)&addClient,&len);
    还有用嘛
      

  6.   

    先确定自己加载了套接字库:
    WORD wVersionRequested;//版本号
    WSADATA wsaData;
    int err;
     
    wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
     
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
      return;
    }//加载套接字库,加裁失败则返回
      

  7.   

    为什么在本机测试的时候是可以的呢?
    小弟初学,请dch4890164大大赐教啊
      

  8.   

    //向服务器发送请求
    msgsock=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
        if (msgsock!=0) {
    MessageBox(0,"connect err",
    "not lind",MB_OK);////客户端执行到这里弹出该提示,就这个错误了
        }
      

  9.   

    SOCKET sock    =    ((RECVPARAM *)lpParameter)->threadSock;
        HWND   hwnd  =    ((RECVPARAM *)lpParameter)->threadHwnd;
        delete lpParameter;
    呵呵看你的程序我快得多疑症了,这我怎么感觉有问题,你删除了lpParameter你的这个hwnd  还有效嘛
    虽然是值拷贝,但是怎么感觉这么悬呢
      

  10.   


     
            if(!AcceptData())//在这里调用accept
            {
                WSACleanup();
                exit(1);
            }
            if (!GetData(tempHwnd)) 
            {
                if(!InitSock())
                    return 0;
                if(!Accept())//这里是调用listen监听的,
                    return 0;
            }
    如果每次监听失败,你的程序都能保证进入第二个if嘛,如果进入不了,你的AcceptData也就没有意义了,因为你包是无效的
    还有本地和远程的时候,处理速度是不一样的,你的程序实在是乱,看不出思路
    =========================================================================
    还有就是你只要接受失败就重新创建,这个效率是不是太低了,你想如果client的connect只连接一次
    如果正好赶上你销毁的过程中,它可能连上嘛
    如果假设你所有的程序都没有错误的话,你的程序连上的最大可能就是你这边刚进入接收,那边正好connect
    这个效率是不是有些低啊,为什么不能用一个包一直在那里accept呢