[問題] C_select()_ non-blocking
開發平台(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
08/02 02:32, 1F
→
08/13 23:02, , 2F
08/13 23:02, 2F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章