23,218
社区成员




int
cmd_prep( char* srv_ip, int cmd_port )
{
int ii;
int retval;
int clisock_set[5];
int svrsock, clisock;
fd_set readfd, rfds;
struct sockaddr_in svr_addr, cli_addr;
pthread_t pth_id;
struct timeval tmout;
int cnt = 1;
int maxfd = -1;
int addr_len = sizeof(cli_addr);
svrsock = create_socket( srv_ip, cmd_port );
if ( svrsock == -1 ) {
perror( "create_socket()" );
exit(-1);
}
for ( ii = 0; ii < MAX_NUM; ii++ )
clisock_set[ii] = -1;
maxfd = svrsock;
FD_ZERO( &readfd );
FD_SET( svrsock, &readfd );
clisock_set[0] = svrsock;
while( 1 ) {
FD_ZERO( &rfds );
rfds = readfd;
tmout.tv_sec = 30;
tmout.tv_usec = 0;
retval = select( maxfd+1, &rfds, NULL, NULL, &tmout );
if ( -1 == retval && EINTR == errno )
continue;
if ( retval < 0 ) {
perror( "select err" );
exit(-1);
}
printf( "循环第[%d]次..........................\n", cnt );
/* 如果listen句柄svrsock可读,则生成与客户端连接可通信clisock描述符,
并放入select监测集合clisock_set中*/
if ( FD_ISSET( svrsock, &rfds ) ) {
clisock = accept( svrsock, (struct sockaddr *)(&cli_addr), &addr_len );
if ( clisock < 0 ) {
perror( "accept err" );
exit(-1);
}
for ( ii = 1; ii < MAX_NUM-1; ii++ ) {
if ( clisock_set[ii] != -1 ) { /* 已经是可通信描述符 */
continue;
}
else {
clisock_set[ii] = clisock; /* 新生成的可通信描述符 */
printf( "接收到客户端连接请求,socket=[%d]\n",clisock_set[ii] );
break;
}
}
if ( MAX_NUM - 1 == ii )
clisock_set[MAX_NUM - 1] = clisock;
FD_SET( clisock, &readfd ); /* 加入到监测描述符集中 */
if ( maxfd < clisock )
maxfd = clisock;
}
/* 与客户端所有可通信描述符中有数据通信产生,处理数据的与返回 */
for ( ii = 1; ii < MAX_NUM; ii++ ) {
int ret, nread;
if ( clisock_set[ii] == -1 )
continue;
if ( !FD_ISSET( clisock_set[ii], &rfds ) ) {
continue;
}
ioctl(clisock_set[ii],FIONREAD,&nread);
if (nread==0){
continue;
}
printf( "处理客户连接请求[%d],\n",clisock_set[ii] );
ret = pthread_create( &pth_id, NULL, msg_process,
(void *)clisock_set[ii] );
if ( ret ) {
perror( "pthread_create() err" );
continue;
}
FD_CLR( clisock_set[ii], &readfd );
clisock_set[ii] = -1;
}
//printf( "\n" );
cnt++;
}
close( svrsock );
return 0;
}
ioctl(clisock_set[ii],FIONREAD,&nread);
if ( nread==0 ){
FD_CLR( clisock_set[ii], &readfd );
close( clisock_set[ii] );
clisock_set[ii] = -1;
continue;
}
rec = recv(fd[j],buffer,BUF_SIZE,0);
if(rec < 0)
{
fprintf(stderr,"received from client: %s failure.\n",inet_ntoa(clientaddr.sin_addr));
exit(1);
}
else if (rec == 0) //如果客户端终止
{
close(fd[j]); //关闭该套接口
FD_CLR(fd[j], &rd); //将该套接口描述字从rd中清除
fd[j] = -1; //将fd数组中相应的描述字置为-1
}
else
{
fprintf(stdout,"success received from client: %s ,the word is: %s.\n",inet_ntoa(clientaddr.sin_addr),buffer);
if(send(fd[j], buffer, rec, 0) != rec)
{
fprintf(stderr,"sento client: %s ,failure. \n",inet_ntoa(clientaddr.sin_addr));
exit(1);
}
}
ioctl(clisock_set[ii],FIONREAD,&nread);
if (nread==0){
continue;
}