[問題] C_select()_ non-blocking

看板C_and_CPP (C/C++)作者 (維他命C)時間14年前 (2011/08/01 21:51), 編輯推噓0(002)
留言2則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc, linux 個人桌上型電腦, 本機127.0.0.1測試 問題(Question): 利用 select() 來寫 non-blocking socket 程式, client 送資料給 server,server 收得到, 但 server 送資料給client,client 收不到… client 的程式應該沒問題,有寫一組 blocking 的測過,server 和 client 都 ok。 麻煩請大家幫忙看一下問題可能出在哪邊,非常感謝。 程式碼(Code):(請善用置底文網頁, 記得排版) non-blocking server,無 error 與 warning,省略宣告error handle等: int main(){ int iSocketId, iAcceptId, iBytes, iSin, iFlag, iSelect, i; struct sockaddr_in rServer, rAccept; char chInBuf[50]; char chOutBuf[50] = {"server gogo"}; fd_set read_flags, write_flags; struct timeval rWait; if((iSocketId=socket(AF_INET, SOCK_STREAM,0)) == -1){//略} //set to non-blocking mode iFlag = fcntl(iSocketId,F_GETFL,0); fcntl(iSocketId,F_SETFL,iFlag | O_NONBLOCK); //initail setup rServer.sin_family = AF_INET; rServer.sin_port = htons(PORT); rServer.sin_addr.s_addr = htonl(INADDR_ANY); bzero( &(rServer.sin_zero),sizeof(rServer.sin_zero)); //bind if(bind(iSocketId,(struct sockaddr*)&rServer, sizeof(struct sockaddr)) == -1){//略} //listen if (listen(iSocketId,MAX_LISTEN) == -1){//略} rWait.tv_sec = 60; rWait.tv_usec = 0; //wait for connect while(1){ FD_ZERO(&read_flags); FD_ZERO(&write_flags); FD_SET(iSocketId, &read_flags); FD_SET(iSocketId, &write_flags); iSelect = select(FD_SETSIZE,&read_flags,&write_flags,NULL,&rWait); if(iSelect<0){//err,略} if(iSelect==0){//timeout,略} iSin = sizeof(struct sockaddr_in); iAcceptId = accept(iSocketId, (struct sockaddr*)&rAccept, &iSin); if (iAcceptId == -1){//略} //Socket ready for reading if(FD_ISSET(iSocketId, &read_flags)) { FD_CLR(iSocketId, &read_flags); memset(chInBuf,0,sizeof(chInBuf)); iBytes = read(iAcceptId, chInBuf, sizeof(chInBuf)); if(iBytes == -1){//略} printf("%s\n",chInBuf);//可成功印出從client送來的資料 } //Socket ready for writing if(FD_ISSET(iSocketId, &write_flags)) { FD_CLR(iSocketId, &write_flags); //client收不到這行write的資料 iBytes = write(iAcceptId, chOutBuf, sizeof(chOutBuf)); if (iBytes == -1){//略} printf("%s\n",chOutBuf);//無顯示 memset(chOutBuf,0,sizeof(chOutBuf)); } close(iAcceptId); }//end of while true close(iSocketId); return EXIT_SUCCESS; }//end of main -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.231.70.156 ※ 編輯: fasta 來自: 118.231.70.156 (08/01 21:57)

08/02 02:32, , 1F
Server socket 永遠只能 read, 不會出現在 write_flags
08/02 02:32, 1F

08/13 23:02, , 2F
謝謝。
08/13 23:02, 2F
文章代碼(AID): #1EDgzL_4 (C_and_CPP)
文章代碼(AID): #1EDgzL_4 (C_and_CPP)