C socket accept és Java kliens port címe
2008-04-07T12:24:27+02:00
2008-04-08T16:59:54+02:00
2022-07-19T09:20:24+02:00
parimana
Sziasztok!

Egy linuxon (uclinux, arm processzor) futó c-ben írt TCP server sockethez kapcsolódok egy java TCP sockettel windows-ból. A kapcsolat felépül és működik is, de a c-ben kiolvasott port szám, amit az accept ad vissza, minden kapcsolódáskor változik, általában egyesével növekszik. A java socket portja a java szerint nem változik. Ez rendben van így? Vagy valami nem stimmel? Valamiért azt gondolom, hogy ennek is állandónak kellene lennie, sőt lehetne a kiválasztott port száma mindig.

Direkt kábelkapcsolaton is ugyanez a helyzet, tehát router nem modosít semmit. Nincs proxy és tűzfal nélkül is ezt tapasztalom. Még abban sem vagyok biztos, hogy melyik (c | java) oldalon kellene keresni a hibát...

A C accept környéki részlet:

void HandleNewConnection() { int i, opt_val; int clientSocket; socklen_t client_details_length; struct sockaddr_in client_details; //printf("\nNew Connection request ...\n"); clientSocket = accept(server_socket, (struct sockaddr *) &client_details, &client_details_length); opt_val = fcntl(clientSocket, F_GETFL); opt_val = (opt_val | O_NONBLOCK); fcntl(server_socket, F_SETFL, opt_val); for(i=0; (i < MAX_NUMBER_OF_CLIENTS) && (clientSocket !=-1); i++) { if(connectList[i] == 0) { getpeername(clientSocket, (struct sockaddr *) &client_details, &client_details_length); char* inetaddress; inetaddress = (char *) alloca(255); const char *pinetaddress; pinetaddress = inet_ntop(client_details.sin_family, &client_details.sin_addr, inetaddress, 255); //printf("Client socket (%d) has accepted ... \t", clientSocket); //printf("Accepted client address: %s\t", pinetaddress); //printf("Accepted client port: %d\n", client_details.sin_port); connectList[i] = clientSocket; inport = ntohs(client_details.sin_port); //Global clientSocket =-1; } } if(clientSocket != -1) { printf("The maximum number of clients is exceeded!\n"); close(clientSocket); } }

Előre is köszönöm a hozzászólásokat!
Mutasd a teljes hozzászólást!
Egy kapcsolatot négy adat azonosít:

Hívó_IP - Hívó_port - Hívott_IP - Hívott_port

Ezek közül a "Hívó_port" teljesen esetleges, minden alkalommal más és más, kár is törődni vele, a tűzfalak a szűrést a másik három adat alapján végzik.
Mutasd a teljes hozzászólást!

  • A java socket portja a java szerint nem változik.


    Melyik port, a lokalis, vagy amelyikre csatlakozik?
    Szerintem teljesen normalis.

    Mutasd a teljes hozzászólást!
  • Szia!

    Köszi a választ. Lehet, hogy valamit alapvetően nem értek. Ha nem tudom egy hálózatban, hogy melyik portokat használják a programok, nem tudok tűzfalat beállítani, nem tudom, hogy melyik porokat kell nyitvahagyni. Vagy ez nem így van?

    A java kliensnél:

    Socket clientSocket = new Socket(); clientSocket.getPort();

    által visszaadott port a server (c program) socket portja. De a válaszhoz nem ugyanezt kellene használni a C szerveren létrejövő kiszolgáló socketnek - ami az accept után jön létre?

    Például a Mysql is más portot használ válaszadáskor, mint ami az ő saját portja?
    Mutasd a teljes hozzászólást!
  • Egy kapcsolatot négy adat azonosít:

    Hívó_IP - Hívó_port - Hívott_IP - Hívott_port

    Ezek közül a "Hívó_port" teljesen esetleges, minden alkalommal más és más, kár is törődni vele, a tűzfalak a szűrést a másik három adat alapján végzik.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd