0

これが私の問題です。サーバーを起動してクライアントで接続しようとすると、クライアントはエンドポイントを見つけることができません。同じクライアントで別のサーバーに接続できるため、クライアントではないことはほぼ確実です。はい、クライアントとサーバーに同じポート番号を使用しています。アドレスには「127.0.0.1」を使用しています。同じポートで別のサーバーを起動し、クライアントで接続できます。私のクライアントコードは一番下に掲載されています。サーバーを実行すると、socket = acceptSocket(...) 行の想定される場所に配置されますが、クライアントはサーバーに接続できません。誰かが問題を見ていますか?読んでくれてありがとう!


サーバーに対して取得した出力は次のとおりです。

新しいサーバーを作成して
います... クライアントを待っています...

クライアントの出力は次のとおりです。

新しいクライアント接続を開始しています....
PORT: 8081
ADDRESS: 127.0.0.1
成功しましたか? false
接続に失敗しました。サーバーを再起動してみてください。


ここに私のserver.cコードがあります:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include "server.h"

//returns a setup server socket
int setupServer(int port, struct sockaddr_in serv)
{
    memset(&serv, 0, sizeof(serv));    /* zero the struct before filling the fields */
    serv.sin_family = AF_INET;         /* set the type of connection to TCP/IP */
    serv.sin_addr.s_addr = INADDR_ANY; /* set our address to any interface */
    serv.sin_port = htons(port);    /* set the server port number */ 

    return socket(AF_INET, SOCK_STREAM, 0); // returns a setup server socket
}

int startServer(int serverSocket, struct sockaddr_in serv)
{
    bind(serverSocket, (struct sockaddr *)&serv, sizeof(struct sockaddr));
    return listen(serverSocket, 1);
}

int acceptSocket(int serverSocket, struct sockaddr_in serv, struct sockaddr_in client)
{
    unsigned int socksize = sizeof(struct sockaddr_in); // how many memory blocks is socket
    printf("%s %d","Socket sze:::", socksize);
    return accept(serverSocket, (struct sockaddr *)&client, &socksize);
}

void closeServer(int socket)
{
    shutdown(socket, SHUT_RDWR);
    close(socket);
}

server.c (server.h) のヘッダーは次のとおりです。

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

#ifndef ServerTools_server_h
#define ServerTools_server_h

int setupServer(int port, struct sockaddr_in serv);
int startServer(int serverSocket, struct sockaddr_in serv);
int acceptSocket(int serverSocket, struct sockaddr_in serv, struct sockaddr_in client);
void closeServer(int socket);

#endif

サーバーを作成して起動するために使用する main.c は次のとおりです。

#include <stdio.h>
#include "server.h"

#define PORT 8081

void println(char* c);
int serverSocket;

struct sockaddr_in serverSettings;

int main(int argc, const char * argv[])
{
    println("Creating a new server...");
    serverSocket = setupServer(PORT, serverSettings);

    startServer(serverSocket, serverSettings);

    println("waiting for a client...");

    struct sockaddr_in client;
    int socket = acceptSocket(serverSocket, serverSettings, client);

    printf("%s %d", "socket accepted: ", socket);

    return 0;
}

void println(char* c)
{
    printf("%s%s", c, "\n");
}

Java で書かれた私のクライアント コード:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client implements Runnable
{
    public Client()
    {
        System.out.println("Starting up a new client connection....");
        System.out.println("PORT: " + PORT);
        System.out.println("ADDRESS: " + ADDRESS);
        boolean success = connect();
        System.out.println("Success? " + success);
        if(!success)
        {
            System.out.println("Connect failed, try restarting server.");
            System.exit(0);
        }

        System.out.println("Connection is setup, listening for data...");

        running = true;
        inputThread = new Thread(this);
        inputThread.start();

        consoleThread = new Thread(new Runnable()
        {
            public void run()
            {
                consoleInput = new BufferedReader(new InputStreamReader(System.in));

                while(running)
                {
                    try
                    {
                        String message = "";
                        while((message = consoleInput.readLine()) != null)
                        {
                            Client.this.sendMessage(message);
                        }
                    }catch(Exception e){}
                }
            }
        });
        consoleThread.start();

    }

    public boolean connect()
    {
        try
        {
            socket = new Socket(ADDRESS, PORT);
            writer = new PrintWriter(socket.getOutputStream());
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            return true;
        }catch(Exception e){}
        return false;
    }

    public void run()
    {
        while(running)
        {
            try
            {
                String message = "";
                while((message = reader.readLine()) != null)
                {
                    System.out.println("Message recieved: " + message);
                }
            }catch(Exception e){}
        }
    }

    public void sendMessage(String message)
    {
        writer.println(message);
        writer.flush();
        if(!writer.checkError())
            System.out.println("Message sent: " + message);
        else
            System.out.println("Message not sent.");
    }

    private Socket socket;
    private PrintWriter writer;
    private BufferedReader reader;
    private BufferedReader consoleInput;
    private boolean running;

    private Thread consoleThread;
    private Thread inputThread;

    public static final int PORT = 8081;
    public static final String ADDRESS = "127.0.0.1";

    public static void main(String args[])
    {
        new Client();
    }
}

telnet から:

127.0.0.1 を試行中...
telnet: アドレス 127.0.0.1 に接続: 接続が拒否されました
telnet: リモート ホストに接続できません


Java からの例外:

java.net.ConnectException: 接続が拒否されました

4

3 に答える 3

2

serverSettings のポインタを setupServer() と startServer() に送信してみてください。

サーバー設定は、値渡しセマンティクスの setupServer() から戻るときにキャンセルされます。

于 2012-12-04T03:57:54.483 に答える
1

server.c ( setupServer, startServer)内の関数は、struct sockaddr_in *それをパラメーターとして受け取るか、受け取らずに global を参照する必要がありますserverSettings

コードの問題は、パラメーターを as としてstruct sockaddr_in serv更新すると、渡された構造変数に変更が反映されないことです。

于 2012-12-04T03:58:07.603 に答える
1

に渡した値が失われていますserv。これは、 のコンテキストではsetupServer()の値のローカル コピーがserverSettingsあり、変更内容が関数の外では見えないためです。終了後にそれらを保持するsetupServerには、ポインターを使用する必要があります。

int setupServer(int port, struct sockaddr_in *serv)
{
    memset(serv, 0, sizeof(*serv));    /* zero the struct before filling the fields */
    serv->sin_family = AF_INET;         /* set the type of connection to TCP/IP */
    serv->sin_addr.s_addr = INADDR_ANY; /* set our address to any interface */
    serv->sin_port = htons(port);    /* set the server port number */ 

    return socket(AF_INET, SOCK_STREAM, 0); // returns a setup server socket
}

次に、次のように呼び出します。

serverSocket = setupServer(PORT, &serverSettings);
于 2012-12-04T03:59:14.543 に答える