- 论坛徽章:
- 0
|
fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?
原帖由 "WeiUnixOracle" 发表:
void call_thread_func(){
struct sockaddr_in hlr_addr;
struct timeval t_wait;
fd_set readfds,wset;
RcmhgQryUserAck_T UserInfo;
char recvBuf[1100],sendBuf[1100],UserNumber[21];
int num_one_recv,num_recv,ret,i;
num_recv=0;
num_one_recv=0;
memset(recvBuf,0,1100);
while(num_recv<31){
t_wait.tv_sec = 5;
t_wait.tv_usec =0;
FD_ZERO(&readfds);
FD_SET(Server_sock, &readfds);
select(Server_sock+1, &readfds, NULL, NULL, &t_wait);
if (!FD_ISSET(Server_sock, &readfds)|| (num_one_recv =recv (Server_sock, recvBuf+num_recv ,64,0))<=0){
printf("Receive call error!\n" ;
close(Server_sock);
close(Client_sock);
return;
}
num_recv+=num_one_recv;
}
printf("\nRecv Call buf is\n" ;
for(i=0;i<num_recv;i++)
printf("%-3d,",recvBuf);
memcpy(UserNumber,recvBuf+18,20);
if ((Client_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Create Socket Error!\n" ;
close(Client_sock);
return;
}
hlr_addr.sin_family = AF_INET;
hlr_addr.sin_port = htons (HLR_PORT);
hlr_addr.sin_addr.s_addr = inet_addr (HLR_ADDR);
memset (&(hlr_addr.sin_zero), 0, icon_cool.gif;
if(fcntl(Client_sock,F_SETFL,O_NONBLOCK) < 0 )
return ;
connect (Client_sock, (struct sockaddr *) &hlr_addr,sizeof (struct sockaddr)
);
t_wait.tv_sec = 5;
t_wait.tv_usec = 0;
FD_ZERO(&wset);
FD_SET(Client_sock,&wset);
select(Client_sock+1,NULL,&wset,NULL,&t_wait);
if(!FD_ISSET(Client_sock,&wset)){
printf("Connect HLR error!\n" ;
close(Client_sock);
return;
}
if(fcntl(Client_sock,F_SETFL,0) < 0 )
return ;
printf("connect HLR OK!\n" ;
ret=RcmhgQryUser(UserNumber,&UserInfo);
if(ret==0)
ret=RcmhgModUser(UserNumber,&UserInfo);
memcpy(sendBuf,recvBuf,1icon_cool.gif;
memset(sendBuf+18,ret,1);
if(send(Server_sock,sendBuf,19,0)<19){
printf("Send resp error!\n" ;
close(Client_sock);
close(Server_sock);
return;
}
if(ret!=0)
close(Client_sock);
close(Server_sock);
}
现在程序老有挂死的现象,想改动一下.
看见红色的代码了?
上面两行设置O_NONBLOCK
下面的清除O_NONBLOCK |
|