我想在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和端口。
客户端不同身份识别肯定是要设计一下身份认证的协议,比如客户端连上来之后发个登录,服务端回个登录成功或失败