在socket中,如何让客户端固定它的端口

我想在socket通信中,让server能判断clinet连上来的是谁。
通常我们写socket通信时,server都这这样写的java:

ServerSocket server = new ServerSocket(9090); 
socket = server.accept();

c++ qt中:

    tcpserver = new QTcpServer();
    tcpserver->listen(QHostAddress::Any,9090);
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(connected()));

客户端java和c++都是差不多的。

可是当客户端链接到server时,同一个客户端每次链接所用的端口都是不同的。如何让client链接到server的端口固定下来,不要每次都随机。

我打算用这个实现判断客户端是谁。或者有没有其他更好的办法。

先bind()再connect()

客户端也是可以绑定端口的,用bind即可,本人只会c++,给你展示一下代码,我在项目里面是用过的,之前预有客户要求客户端绑定端口,主要是安全上的需求,他们的程序需要判断客户端的端口来进行确认:

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(1, 1);

    WSAStartup( wVersionRequested, &wsaData );

    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);


    // tcp客户端也要玩玩bind啦, 童鞋们!!!
    SOCKADDR_IN addrClient;
    addrClient.sin_family = AF_INET; 
    addrClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 客户端地址
    addrClient.sin_port = htons(7777); // 客户端为7777端口
    bind(sockClient,(SOCKADDR*)&addrClient, sizeof(SOCKADDR)); // 客户端也来玩玩绑定


    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 服务器地址
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(8888);
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    char recvBuf[100] = {0};
    recv(sockClient, recvBuf, 100, 0);
    printf("%s\n", recvBuf);
    send(sockClient, "hello world", strlen("hello world") + 1, 0);

    getchar();

    closesocket(sockClient);
    WSACleanup();

    return 0;
}

端口是可以绑定的,这个在网上查一下就知道了,区分客户端是根据客户端socket连接和传过来的id进行区分的

你这种想法肯定没法实际应用的,服务端一般都是不知道客户端的IP和端口的,比如通过路由器上网连外网的服务端,服务端拿到的是路由器这边的IP和端口。
客户端不同身份识别肯定是要设计一下身份认证的协议,比如客户端连上来之后发个登录,服务端回个登录成功或失败