请教进程与Socket句柄的关系

时间:2021-03-12 11:35:03
   小第刚接触MFC网络编程这块,对客户端和服务端间的进程有很大的疑惑,比如客户端有4个BUTTON,点击其中一个就会建立一个socket与服务端通信,服务端就会把这个按钮要求的信息返回,但是服务端如何识别这4个socket呢,也就是点击BUTTON1,服务端就会把BUTTON1要求的信息返回去,点击BUTTON2就会返回2要求的信息,而不会点击1返回3要求的信息,发生这种混乱。。。
   顺便说句,有什么这方面的资料或书能推荐点么,就这点分,全给了。。。

9 个解决方案

#1


每个socket的句柄都不一样,其他信息,可以放到sruct中发送,返回也一样,根据返回信息就知道是那个按钮发送的

#2


服务器accept后返回的套接字啊,把这个套接字丢到任务线程去,对于每一个客户端都开一个工作线程,负责一一对应的处理业务!

#3


引用 1 楼 bdmh 的回复:
每个socket的句柄都不一样,其他信息,可以放到sruct中发送,返回也一样,根据返回信息就知道是那个按钮发送的


也就是说,在服务端建立4个监听socket(1、2、3、4)和一个返回数据的socket(psocket),用四个if语句:
   if(socket1->Accept(*psocket){返回给BUTTON1的信息}
   if(socket2->Accept(*psocket){返回给BUTTON2的信息}
   if(socket3->Accept(*psocket){返回给BUTTON3的信息}
   if(socket4->Accept(*psocket){返回给BUTTON4的信息}

TO bdmh和wjh173069597,这样就可以实现了发送对应的信息过去,并能在对应的按钮中正确显示是么?
还想请问下,一次建立4个监听的socket,会出现什么冲突么?

#4


服务端只建立一个侦听
BIND->LENTEN->ACEPT->SEND or RECV
同一个客户端,也只连接1次
CONNECT->SEND or RECV
如何区分4个按钮呢?
按钮1发消息1
按钮2发消息2
就可以了,消息1和消息2的消息头不一样,进行数据解析就可以了

#5


这里有两个问题
第一
客户端申请链接,服务器端监听到进行处理
这个时候服务器会构造一个socket和客户端通信
这个过程是一一对应的
也就是说每有一个客户端申请就会有一个相应的服务器端的socket与其进行通信
第二
关于服务器如何知道谁是谁这是有通信协议负责的
也就是说你要自己设置通信协议
服务器和客户端进行通信是都是靠解析协议来完成功能的

#6


让教授过TCP/IP协议编程的老师来解释吧:

服务器和客户端的2个进程通讯是通过1个5元组进行一一对应的:
 协议 , 服务端IP,服务端0的端口号,客户端IP,客户端端口号

服务器和客户端必须就有相同的协议才能通讯,这里一般就是TCP/IP,
服务器有自己的IP地址和端口号,客户端 在连接的时候根据他们连接服务器,同时把自己的IP地址和端口号告诉服务器. 这时候在服务器端保留一个客户端的套接字句柄,
及   SOCKET cliSock = accept()返回的套接字句柄,每个连接都需要accept()后双方才能通信,这样在服务端就有  cliSock1 ,clisock2,clisock3....需要和谁通信是使用哪个clisock进行 recv和send.而客户端却不需要知道那么多,只要把消息发到服务器就可以了。。

看看任泰明的  TCP/IP协议编程,适合初学者

#7


为什么要客户端建立四个socket?
客户端有一个socket保持和服务端连接,该过程放在一个线程里。界面线程和工作线程可以进行双向通信。
每当button按下,可以在发送数据里带上自身的标识,服务器处理完了,返回信息中也带上相应的标识。这样回到客户端后,可以区分该给哪个button。

#8


两个进程可以跨网络的 关系就是你应我答 通过底层驱动命令硬件直接通讯 如果具体端口有合法数据驱动程序在发送给应用程序

#9


可以这样:


#define SOCKET_1 1001
#define SOCKET_2 1002
#define SOCKET_3 1003
#define SOCKET_4 1004


当你点击按钮时候,让客户端自己发送一个标识哪个socket的int的数据,服务器端接到后,读取接收到的int数据,来判定是点的哪个按钮,从而返回对应的数据

#1


每个socket的句柄都不一样,其他信息,可以放到sruct中发送,返回也一样,根据返回信息就知道是那个按钮发送的

#2


服务器accept后返回的套接字啊,把这个套接字丢到任务线程去,对于每一个客户端都开一个工作线程,负责一一对应的处理业务!

#3


引用 1 楼 bdmh 的回复:
每个socket的句柄都不一样,其他信息,可以放到sruct中发送,返回也一样,根据返回信息就知道是那个按钮发送的


也就是说,在服务端建立4个监听socket(1、2、3、4)和一个返回数据的socket(psocket),用四个if语句:
   if(socket1->Accept(*psocket){返回给BUTTON1的信息}
   if(socket2->Accept(*psocket){返回给BUTTON2的信息}
   if(socket3->Accept(*psocket){返回给BUTTON3的信息}
   if(socket4->Accept(*psocket){返回给BUTTON4的信息}

TO bdmh和wjh173069597,这样就可以实现了发送对应的信息过去,并能在对应的按钮中正确显示是么?
还想请问下,一次建立4个监听的socket,会出现什么冲突么?

#4


服务端只建立一个侦听
BIND->LENTEN->ACEPT->SEND or RECV
同一个客户端,也只连接1次
CONNECT->SEND or RECV
如何区分4个按钮呢?
按钮1发消息1
按钮2发消息2
就可以了,消息1和消息2的消息头不一样,进行数据解析就可以了

#5


这里有两个问题
第一
客户端申请链接,服务器端监听到进行处理
这个时候服务器会构造一个socket和客户端通信
这个过程是一一对应的
也就是说每有一个客户端申请就会有一个相应的服务器端的socket与其进行通信
第二
关于服务器如何知道谁是谁这是有通信协议负责的
也就是说你要自己设置通信协议
服务器和客户端进行通信是都是靠解析协议来完成功能的

#6


让教授过TCP/IP协议编程的老师来解释吧:

服务器和客户端的2个进程通讯是通过1个5元组进行一一对应的:
 协议 , 服务端IP,服务端0的端口号,客户端IP,客户端端口号

服务器和客户端必须就有相同的协议才能通讯,这里一般就是TCP/IP,
服务器有自己的IP地址和端口号,客户端 在连接的时候根据他们连接服务器,同时把自己的IP地址和端口号告诉服务器. 这时候在服务器端保留一个客户端的套接字句柄,
及   SOCKET cliSock = accept()返回的套接字句柄,每个连接都需要accept()后双方才能通信,这样在服务端就有  cliSock1 ,clisock2,clisock3....需要和谁通信是使用哪个clisock进行 recv和send.而客户端却不需要知道那么多,只要把消息发到服务器就可以了。。

看看任泰明的  TCP/IP协议编程,适合初学者

#7


为什么要客户端建立四个socket?
客户端有一个socket保持和服务端连接,该过程放在一个线程里。界面线程和工作线程可以进行双向通信。
每当button按下,可以在发送数据里带上自身的标识,服务器处理完了,返回信息中也带上相应的标识。这样回到客户端后,可以区分该给哪个button。

#8


两个进程可以跨网络的 关系就是你应我答 通过底层驱动命令硬件直接通讯 如果具体端口有合法数据驱动程序在发送给应用程序

#9


可以这样:


#define SOCKET_1 1001
#define SOCKET_2 1002
#define SOCKET_3 1003
#define SOCKET_4 1004


当你点击按钮时候,让客户端自己发送一个标识哪个socket的int的数据,服务器端接到后,读取接收到的int数据,来判定是点的哪个按钮,从而返回对应的数据