LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1171|回复: 5

Linux与Windows网络编程通讯问题

[复制链接]
发表于 2007-9-28 21:21:07 | 显示全部楼层 |阅读模式
代码如下:
这个是Linux下写的服务器端程序:
int main (int argc, char *argv[])
{
        int i;
        for (i = 0; i < MAX_COUNT; i++)
                a_sock = -1;
        l_sock = socket (AF_INET, SOCK_STREAM, 0);
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons (L_PORT);
        sock_addr.sin_addr.s_addr = htonl (INADDR_ANY);
        if (bind (l_sock, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) < 0)
        {
                close (l_sock);
                printf ("can not bind!\n");
                return 0;
        }
        if (listen (l_sock, 5) != 0)
        {
                close (l_sock);
                printf ("can not listen!\n");
                return 0;
        }
        
        while (1)
        {
                int sock_count = getcount ();
                int sock_len = sizeof (sock_addr);
                if ((a_sock[sock_count] = accept (l_sock, (struct sockaddr *)&sock_addr, &sock_len)) < 0)
                {
                        close (l_sock);
                        printf ("can not accept!\n");
                        return 0;
                }
                printf ("accept success!\n");
                if ((fork ()) == 0)
                {
                        int pid = getpid ();
                        close (l_sock);
                }                        
        }
        
        return 0;
}

程序编译和运行都正常的,在监听状态


这个是windows下的客户端程序:(其他没关联部分我都省略了)
           m_cSock = socket (AF_INET, SOCK_STREAM, 0);

        m_cAddr.sin_addr.S_un.S_addr = htonl (inet_addr (s_IP));
        m_cAddr.sin_family = AF_INET;
        m_cAddr.sin_port = htons (atoi (s_Port));

        if (connect (m_cSock, (sockaddr *)&m_cAddr, sizeof (m_cAddr)))
        {
                AfxMessageBox ("can not connect");
                return;
        }
        SetWindowText ("已经连接上");



但是windows的connect一直连不上linux
我后来分别写了linux的客户端和windos的服务器端进行测试,结果同样操作系统下面都是能连接成功的

但是如果是windows与linux连接就不行,这是为什么?
代码哪部分存在问题吗?
防火墙我已经关闭了的。


而且,反过来,以Linux作为客户端,Windows作为服务器端又是能够连接成功的
都已经搞不清楚怎么会这样了


我在后面加了GetLastError显示错误信息,但是明明没有连接成功,竟然也提示我"操作成功"(因为服务器始终处于监听状态)
DWORD nErrorNo = GetLastError ( ); // 得到错误代码
    LPSTR lpBuffer;   
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_IGNORE_INSERTS |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
        LANG_NEUTRAL,
        (LPTSTR) & lpBuffer,
        0 ,
        NULL);
    CString strErrorCause = lpBuffer ? _T(lpBuffer) : _T(" Sorry, cannot find this error info.");
        AfxMessageBox (lpBuffer);
    UpdateData (FALSE);
  
    //  Free the buffer.
    LocalFree (lpBuffer);
这是显示错误信息的代码
发表于 2007-9-28 21:43:20 | 显示全部楼层
使用WSAGetLastError看看返回什么错误啊!
回复 支持 反对

使用道具 举报

发表于 2007-9-28 22:17:10 | 显示全部楼层
用wireshark抓包看看通讯过程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-29 09:42:44 | 显示全部楼层
wireshark抓包试过了
说是ICMP HOST UNREABLE,主机不可达
这个该怎么解决呢
回复 支持 反对

使用道具 举报

发表于 2007-9-29 09:52:29 | 显示全部楼层
这个和操作系统没有关系吧, 检查一下系统上的网络配置, 是不是路由不通啊
先用ping确认2个系统之间是连通的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-29 10:13:42 | 显示全部楼层
我ping过了
而且,我在帖子里也讲了,用Linux作为客户端,Windows作为服务器端
也是socket编程,两者就能连接成功
我都感觉有点莫名其妙了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表