将 c++ unix server/socket 连接到 java windows client/socket

Posted

技术标签:

【中文标题】将 c++ unix server/socket 连接到 java windows client/socket【英文标题】:Connect c++ unix server/socket to java windows client/socket 【发布时间】:2014-02-15 14:14:43 【问题描述】:

首先,我想感谢您抽出宝贵时间...

我在我的 macbook 中用 c++ 创建了一个服务器套接字,并在运行 windows xp 的不同机器中使用 Java 创建了一个客户端/套接字。我已将端口指定为 5000,但我无法指定正确的主机,因此无法建立连接。当我使用 WinSock2 在 windows xp 中创建一个 c++ 服务器/套接字时,连接是完美的,因为我使用了 localhost...任何想法???

提前谢谢

C++ 代码


int main(int argc, const char** argv)

/* SOCKET VARIABLES */
int sock;
struct sockaddr_in server;
int mysock;
char buff[1024];
int rval;


/*CREATE SOCKET*/
sock =socket(AF_INET, SOCK_STREAM, 0);
if (sock<0) 

    perror("*FAILED TO CREATE SOCKET*");
    exit(1);


server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=5000;

/*CALL BIND*/
if (bind(sock, (struct sockaddr *)&server, sizeof(server)))

    perror("BIND FAILED");
    exit(1);



/*LISTEN*/
listen(sock, 5);


/*ACCEPT*/
do

    mysock= accept(sock, (struct sockaddr *) 0, 0);

    if (mysock==-1) 
    

        perror ("ACCEPT FAILED");
    
    else
    
        memset(buff, 0, sizeof(buff));

        if ((rval=recv(mysock, buff, sizeof(buff), 0)) <0) 
            perror("READING STREAM MESSAGE ERROR");
        
        else if(rval==0)
            printf("Ending connection");
        else
            printf("MSG: %s\n", buff);

        printf("GOT THE MESSAGE (rval = %d)\n", rval);

    

    return 0;
while (1) ;

Java 代码


导入 java.io.; 导入 java.net.;

公共类 SOK_1_CLIENT

public void run() throws Exception

    Socket SOCK =new Socket ("localhost",5000);
    PrintStream PS =new PrintStream(SOCK.getOutputStream());
    PS.println("HELLO TO SERVER FROM CLIENT");

    InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
    BufferedReader BR = new BufferedReader(IR);

    String MESSAGE =BR.readLine();
    System.out.println(MESSAGE + "java");


【问题讨论】:

如果你没有 DNS 服务器,你应该使用服务器的 ip 而不是“localhost” 如果您没有 DNS、WINS 或设置 hosts 文件,则需要使用 IP 地址。 我将java代码从Socket SOCK =new Socket ("localhost",5000); to Socket SOCK =new Socket ("172.16.149.14",5000);我的服务器 ip 但我得到相同的错误...服务器工作但客户端无法连接 你是在同一个局域网上测试吗? IP 地址 172.16.149.14 似乎不是标准的本地 IP 地址,在这种情况下它可能会被防火墙阻止? 添加到骗局:每个主机可以ping对方? 【参考方案1】:

在 java 客户端中,使用运行服务器的系统的 IP 地址,而不是“localhost”。本地主机将引用运行客户端代码的机器的本地环回地址,即 127.0.0.1,但您的服务器运行在不同的机器上,因此无法连接:

public void run() throws Exception

    String address = "address_of_machine_running_server";
    Socket SOCK =new Socket (address,5000);
    PrintStream PS =new PrintStream(SOCK.getOutputStream());
    PS.println("HELLO TO SERVER FROM CLIENT");

    InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
    BufferedReader BR = new BufferedReader(IR);

    String MESSAGE =BR.readLine();
    System.out.println(MESSAGE + "java");

另请注意,您需要相应地设置防火墙以允许连接。

允许两台机器的传入和传出连接 检查你的服务器IP地址是否正确 尝试使用其 IP 地址 ping 主机(服务器)以确保其正常运行 如果以上所有结果都为正,您将获得成功的连接。

【讨论】:

以上是关于将 c++ unix server/socket 连接到 java windows client/socket的主要内容,如果未能解决你的问题,请参考以下文章

Socket基本操作的C++封装--以及Socket通信实践

C++:我将如何获得 unix 时间?

将 C++ std::clog 重定向到 Unix 上的 syslog

如何将文本文件分解成更小的块(在 Unix 上使用 C++)?

如何在 Unix 上包含 «pty.h» 头文件/将 «pty.h» 添加到标准库 C / C++

Java Server:Socket将HTML代码发送到浏览器