これが私の問題です。サーバーを起動してクライアントで接続しようとすると、クライアントはエンドポイントを見つけることができません。同じクライアントで別のサーバーに接続できるため、クライアントではないことはほぼ確実です。はい、クライアントとサーバーに同じポート番号を使用しています。アドレスには「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: 接続が拒否されました