【问题标题】:Android client can't open a socket to a C serverAndroid 客户端无法打开到 C 服务器的套接字
【发布时间】:2014-02-20 11:19:11
【问题描述】:

我找不到关于这个非常具体的问题的任何信息,但也许其他人已经这样做了。

我有一个用 C 编写的服务器程序(为了便于阅读,删除了错误检查):

int main(int arc, char *argv[])
{
    int sockfd, newsockfd, portnum, cli_len, num_chars, n;

    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    // Set up the socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // Set up our variables
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portnum = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(portnum); // Convert from host port to network port
    serv_addr.sin_addr.s_addr = INADDR_ANY;

    if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("Socket could not be bound");

    listen(sockfd, 5); // Get ready to receive connections

    cli_len = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &cli_len);

    // Message processing

    return 0;
}

同时,我有 Android 客户端(版本 4.1.2):

private class ClientTask extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {
            try {
                InetAddress a = InetAddress.getByAddress(new byte[] {(byte) 192, (byte) 168, 1, (byte) 102});
                sock = new Socket(a, 65053);
                BufferedReader inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                DataOutputStream outToServer = new DataOutputStream(sock.getOutputStream()); 

                // Message processing

            } catch (UnknownHostException e) {
                System.out.println("No address found for ");
            } catch (IOException e) {
                System.out.println("Failed to open socket");
            }
            return null;
        }
    }

我遇到的问题是 Android 客户端无法打开套接字。超时后我总是收到“无法打开套接字”。 android客户端与我拥有的java服务器一起工作,我拥有的java客户端至少与C服务器建立连接。我不明白可能出了什么问题...

如果您需要更多详细信息或其他代码,请告诉我。

【问题讨论】:

  • 您是否在 Manifest 文件中允许互联网连接?
  • @triclosan 是的,因为 Android 客户端可以连接到我第一次尝试的 java 服务器(在我尝试运行 C 服务器的同一台机器上运行)
  • 检查服务器上是否有防火墙。

标签: java android c sockets


【解决方案1】:

您没有指定是否在同一个 LAN 下同时运行两个设备(服务器和客户端),在这种情况下,您可以放弃连接问题。如果没有,这可能是一个测试。如果您能够将您的客户端连接到同一路由器下的服务器,这意味着否则(即使用您的公共 IP)会有一些东西阻止它,可能是您的路由器。另一个问题可能是防病毒、操作系统端口阻塞、路由器端口阻塞......

如果您无法在同一路由器连接下同时连接两者,则肯定是代码问题。由于您不知道罪魁祸首在哪里,我建议在客户端代码中放置几条 Log.d() 行,在服务器代码中的服务器代码中放置几行 printf() 语句,并查看瓶颈在哪里,或者使用一些调试工具并放置一些断点。

---- 编辑----

尝试以这种方式连接:

Socket socket;
final String host = "192.168.1.X";
final int port = 65053;
final int timeout = 30000;   // 30 seconds

try {
  socket = new Socket();
  socket.connect(new InetSocketAddress(host, port), timeout);
}
catch (UnknownHostException uhe) {
  Log.e("Sock", "I couldn't resolve the host you've provided!");
}
catch (SocketTimeoutException ste) {
  Log.e("Sock", "After a reasonable amount of time, I'm not able to connect!");
}
catch (IOException ioe) {
  Log.e("Sock", "Hmmm... Sudden disconnection, probably you should start again!");
} 

【讨论】:

  • 是的,两台设备都在同一个路由器上。但是,我可以将 Android 客户端连接到运行 Java 服务器的计算机。我调试了 Android 客户端,它在创建套接字时挂起,sock = new Socket(a, 65053);
  • 似乎仍然超时,堆栈跟踪:02-20 05:43:50.361: W/System.err(32479): at libcore.io.IoBridge.connectErrno(IoBridge.java:159) 02-20 05:43:50.361: W/System.err(32479): at libcore.io.IoBridge.connect(IoBridge.java:112)
  • 这并不能说明什么,您应该更新您的问题并发布完整的堆栈跟踪。
【解决方案2】:

Whelp,这是一个防火墙问题,太尴尬了。显然 Eclipse 被允许通过我的防火墙,这就是 Java 服务器工作的原因,但是当我通过命令行运行我的 C 代码时,我一定错过了提示。我禁用了我的防火墙,它立即生效。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2014-05-21
    • 2023-03-11
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多