TCP/IP網(wǎng)絡(luò)重復(fù)型服務(wù)器通信軟件的設(shè)計(二)

字號:

⑷ tcp_c用listen(s_c1,5)在套接字s_c1上建立客戶機的第一個監(jiān)聽隊列,等待服務(wù)器的連接請求。在與服務(wù)器建立第一個連接后,再用listen(s_c2,5)建立第二個監(jiān)聽隊列,與服務(wù)器建立第二個連接。
    listen(s_c1,5);
    s_w=accept(s_c1,&peeraddr_in,&addrlen);
    close(s_c1); /*只允許接收一次連接請求*/
    linger.l_onoff=1;linger.l_linger=0;
    setsockopt(s_w,SOL_SOCKET,SO_LINGER,&linger,sizeof(struct linger));
    listen(s_c2,5);
    s_r=accept(s_c2,&peeraddr_in,&addrlen);
    close(s_c2);
    setsockopt(s_r,SOL_SOCKET,SO_LINGER,&linger,sizeof(struct linger)); 來源:www.examda.com
    ⑸ 進程tcp_s1調(diào)用函數(shù)Server_Receive在一個循環(huán)中不斷查詢是否又有新的客戶機登記在共享內(nèi)存中,方法是判斷共享內(nèi)存中最后一條記錄的linkf1標(biāo)志是否為0,如果為0就調(diào)函數(shù)connect_to_client與客戶機建立第一個連接,然后輪詢所有的讀套接字,有數(shù)據(jù)則讀,沒有數(shù)據(jù)則讀下一個讀套接字。
    Server_Receive(){
    int s1,len,i,linkn,linkf1,n;
    struct msg_buf *buf,mbuf;
    buf=&mbuf;
    for(;;){
    linkn=shm_info(0,GETLINKN);
    linkf1=shm_info(linkn,GETLINKF1);
    if(linkf1==0){
    if((i=connect_to_client(linkn,1))<0){
    shm_logout(linkn);continue;
    }
    }
    for(n=1;n<=linkn;n++){
    s1=shm_info(n,GETS1);
    i=read(s1,buf,MSGSIZE);
    if(i==0){
    fprintf(stderr,"A client exit!\n");
    shutdown(s1,1);close(s1);
    shm_logout(n);
    linkn--;continue;
    }
    if(i==-1) continue;
    buf->mtype=MSGTYPE;buf->sid=n;
    len=strlen(buf->mdata);
    fprintf(stderr,"mdata=%s\n",buf->mdata);
    i=msgsnd(qid3,buf,len+BUFCTLSIZE+1,0);
    }
    }
    }