微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在中间有服务器的客户端之间转发消息

如何解决在中间有服务器的客户端之间转发消息

我想从一个客户端接收一条消息,然后将它发送到另一个客户端,中间有一个服务器。 我使用 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 举报,一经查实,本站将立刻删除。