не удается подключить клиент Java к серверу C - PullRequest
0 голосов
/ 17 января 2011

У меня очень простой сервер, написанный на C, и такой же простой клиент, написанный на Java. Когда я запускаю их обоих на одном компьютере, все работает, но когда я пытаюсь запустить сервер на компьютере A и клиент на компьютере B, я получаю сообщение об ошибке Отказ IOException: отказано от клиента java. Кажется, я не могу понять, что происходит, есть мысли? Я даже выключил брандмауэры, но проблема все еще сохраняется.

сервер.

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 3557
#define BUF 256

int main(int argc, char *argv[])
{
    struct sockaddr_in host, remote;
    int host_fd, remote_fd;
    int size = sizeof(struct sockaddr);;

    char data[BUF];

    host.sin_family = AF_INET;
    host.sin_addr.s_addr = htonl(INADDR_ANY);
    host.sin_port = htons(PORT);
    memset(&host.sin_zero, 0, sizeof(host.sin_zero));

    host_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(host_fd == -1) {
        printf("socket error %d\n", host_fd);
        return 1;
    }

    if(bind(host_fd, (struct sockaddr *)&host, size)) {
        printf("bind error\n");
        return 1;
    }

    if(listen(host_fd, 5)) {
        printf("listen error");
        return 1;
    }

    printf("Server setup, waiting for connection...\n");
    remote_fd = accept(host_fd, (struct sockaddr *)&remote, &size);

    printf("connection made\n");

    int read = recv(remote_fd, data, BUF, 0);
    data[read] = '\0';
    printf("read = %d, data = %s\n", read, data);

    shutdown(remote_fd, SHUT_RDWR);
    close(remote_fd);

    return 0;
}

клиент.

import java.net.*;
import java.io.*;

public class socket {

    public static void main(String[] argv) {
        DataOutputStream os = null;

        try {
            Socket socket = new Socket("192.168.1.103", 3557);
            os = new DataOutputStream(socket.getOutputStream());
            os.writeBytes("phone 12");

            os.close();
            socket.close();

        } catch (UnknownHostException e) {
            System.out.println("Unkonw exception " + e.getMessage());

        } catch (IOException e) {
            System.out.println("IOException caught " + e.getMessage());
        } 
    }
}

Edit:

Спасибо всем за быстрый ответ (я был в шоке). Я решил проблему благодаря предложениям по использованию telnet и nc. Я обнаружил, что мой брандмауэр блокирует порт 3557 на сервере. Простая вещь, о которой я должен был подумать, спасибо!

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Есть много возможных проблем, и вы должны начать и попытаться определить проблемную часть.

Это может быть просто проблема с сетью - B может не подключиться к A из-за брандмауэров и тому подобного.

Чтобы проверить это, вы можете начать с сканирования портов с B на A (nmap -p 3557 192.168.1.103, чтобы проверить, не открыт ли порт для компьютера B).

Если он выглядит открытым, попробуйтесоединяясь с telnet / nc из B вместо вашего клиента, чтобы увидеть, работает ли сервер, как ожидалось: telnet 192.168.1.103 3557 или nc 192.168.1.103 3557 и после подключения напишите «phone 12» и посмотрите, что вы получите.

Это должно помочьВы понимаете, какая часть вызывает проблемы: сервер, клиент или сеть.

0 голосов
/ 17 января 2011

Ну, во-первых, поверьте сообщению об ошибке: если вы получаете «Отказ в соединении», предположите, что другой конец отказывает в соединении.Тогда возникает вопрос: почему?

Почти всегда оказывается, что это просто "глупая ошибка".Прежде чем что-либо делать глубоко, убедитесь, что:

  • IP-адреса и порты верны
  • нет никаких свободных процессов, также пытающихся использовать порт 3557 (хотя это обычно дает другойсообщение об ошибке)
  • , что ваша серверная сторона работает и находится в состоянии ожидания ввода-вывода, прежде чем пытаться подключиться
  • , что оба конца работают при запуске на том же 1013 * machine.

Предполагая, что все это работает, затем используйте telnet (1) , чтобы попытаться подключиться к серверу.Если это сработает, telnet должен быть в состоянии прочитать другой конец.

Commend на самом деле принимает два аргумента, хост и порт:

$ telnet 192.168.1.103 3557

должен подключиться к серверу на либо машина, и, конечно,

$ telnet localhost 3557

должны работать в серверной системе.

Если программы работают, пока вы находитесь в одной системе, ноне удаленно, у вас есть какая-то проблема с маршрутизацией или брандмауэром.(Убедитесь, что у вас нет «умного» коммутатора, пытающегося ограничить определенные порты вне того, что делает ваш брандмауэр.)

Если программы не будут работать в той же системе, убедитесь, что серверждет ввода / вывода и попробуйте трюк telnet.Если сервер не остановлен в ожидании ввода / вывода, прочитайте справочную страницу для флагов в вызовах вашей библиотеки.Никто никогда не помнит их всех;некоторые из них имеют таинственные побочные эффекты, которые вы не заметите.

Если сервер остановлен в ожидании ввода-вывода и telnet не подключается, добавьте несколько printfs, чтобы убедиться, что он работает так, как вы планируете.в частности, взгляните на значения возврата accept и recv - если у вас есть программа, которая не работает, и вы не протестировали все коды возврата, вы можете сделать ставку(это один из законов Мерфи, без сомнения), что один из вызовов, которые вы не тестируете, не работает.

Если вы можете подключиться через telnet и набрать данные наУспешно, перейдите к Java.Попробуйте сделать os a FileOutputStream и посмотрите, получится ли то, что вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...