如何解决在中间有服务器的客户端之间转发消息
我想从一个客户端接收一条消息,然后将它发送到另一个客户端,中间有一个服务器。
我使用 select
函数来建立与服务器的多个连接,但问题是:
我使用 sock
将套接字描述符 Queue[pq]
存储在 dup
中并且它正在工作。 sock = 4 & Queue[0] = 5
。现在我需要获取另一个客户端的套接字描述符,并再次将其存储在 Queue
中。 Client(2) 的 Queue
的值等于 Queue[0] = 5,Queue[1] = 7
但对于第一个客户端它仍然是 Queue[0] = 5 and Queue[1] = 0
这意味着第一个客户端的代码无权访问第二个客户端的套接字描述符我不能使用他的套接字描述符和 send()
将它转发给另一个客户端,客户端 3 有前 2 个客户端的套接字描述符,但前 2 个客户端没有第三个的套接字描述符。
我认为这是因为 select()
为每个客户端的值使用不同的内存地址,就像 sock
对每个连接具有不同的值一样。
我该如何解决这个问题?客户端如何访问彼此的套接字描述符?
代码:
Global Values:
int tcpfd,udpfd,Sock,nready,maxfdp1;
int Queue[64];
int pq = -1;
int max(int x,int y) {
if (x > y)
return x;
else
return y;
}
int main(){
pid_t childpid;
fd_set rset;
ssize_t n;
socklen_t len;
const int on = 1;
struct sockaddr_in cliaddr,servaddr;
void sig_chld(int);
/* create listening TCP socket */
tcpfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("192.168.1.5");
servaddr.sin_port = htons(PORT);
// binding server addr structure to tcpfd
bind(tcpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(tcpfd,10);
// clear the descriptor set
// get maxfd
maxfdp1 = max(tcpfd,udpfd) + 1;
for (;;) {
// set tcpfd and udpfd in readset
FD_ZERO(&rset);
FD_SET(tcpfd,&rset);
// select the ready descriptor
nready = select(maxfdp1,&rset,NULL,NULL);
// if tcp socket is readable then handle
// it by accepting the connection
if (FD_ISSET(tcpfd,&rset)){
len = sizeof(cliaddr);
Sock = accept(tcpfd,(struct sockaddr*)&cliaddr,&len);
pq++;
Queue[pq] = dup(Sock);
printf("%d\n",Sock);
if ((childpid = fork()) == 0) {
Access_Request();
while(1) { //rest of the code
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。