⑷ 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);
}
}
}
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);
}
}
}