kevinpengjiawei
2019-07-02 10:32
采纳率: 0%
浏览 1.9k

在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的端口固定下来,不要每次都随机。

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • GALDspeed 2019-07-02 10:35

    先bind()再connect()

    评论
    解决 无用
    打赏 举报
  • 白色一大坨 2019-07-02 11:04

    客户端也是可以绑定端口的,用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;
    }
    
    
    评论
    解决 无用
    打赏 举报
  • churuxu 2019-07-02 18:23

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

    评论
    解决 无用
    打赏 举报
  • JousonRen 2019-07-03 18:29

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题