首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

,linux中select函数的有关问题

2012-03-27 
请教高手,linux中select函数的问题最近刚刚学习linux下的socket编程,在实现多客户端通信的时候,服务器端原

请教高手,linux中select函数的问题
最近刚刚学习linux下的socket编程,在实现多客户端通信的时候,服务器端原本用gethostbyname函数可以成功,但是现在想用getAddrinfo函数使得IPv4、IPv6都能用时,select函数无法判断客户端的连接,程序被阻塞在select这一句,不知道哪里出问题了,请教各位高手帮忙解答下,谢拉啊!

Server端程序
#include<sys/socket.h>
#include<iostream>
#include<sys/types.h>
#include<strings.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<pthread.h>
#define MAXSIZE 1024
#define MAXSOCKET 3
int count=0;
int get_file;
fd_set readfds;
void *get_client(void *);
using namespace std;

int main(int argc,char *argv[])
{
  if(argc<3)
  {
  cout<<"Please enter port or file path:"<<endl;
  exit(1);
  }
  int serverSock,confd;
  //char *server_file;
  struct sockaddr_in addr;
  pthread_t thread_test;
  socklen_t addr_len=sizeof(addr);
  if((serverSock=socket(AF_INET,SOCK_STREAM,0))<0)
  {
  cout<<"socket failed!"<<endl;
  exit(1);
  }
  in_port_t port=atoi(argv[1]);
  if((get_file=open("/home/tracy/software/sock_file/test",O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR))==-1)
  {
  cout<<"Can't find file!"<<endl;
  exit(1);
  }
  // server_file=get_file;
  bzero(&addr,sizeof(addr));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(port);
  // addr.sin_port=htons("4000");
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  if(bind(serverSock,(struct sockaddr*) &addr,sizeof(addr))<0)
  {
  cout<<"bind failed!"<<endl;
  exit(1);
  }
  if(listen(serverSock,3)<0)
  {
  cout<<"listen failed!"<<endl;
  exit(1);
  }
  while(1)
  {
  FD_ZERO(&readfds);
  FD_SET(serverSock,&readfds);
  if(select(MAXSOCKET+1,&readfds,NULL,NULL,0))
  {
  if(FD_ISSET(serverSock,&readfds)>0)

  {
  confd=accept(serverSock,(struct sockaddr*)&addr,&addr_len);
  count=count+1;
  pthread_create(&thread_test,NULL,&get_client,(void*)confd);
  }
  }

  }

 }
  void *get_client(void *newSock)
{
  char buffer[MAXSIZE];
  int recv_write;
  // char *server_file;
  /*if(count<=MAXSOCKET)
  {
  if(recv((int)newSock,buffer,MAXSIZE,0)<0)
  {
  cout<<"receive failed!"<<endl;
  return NULL;
  }
  cout<<"connect client:"<<endl;
  cout<<buffer<<endl;
  if(send((int)newSock,"hello,I'm server!",strlen("hello,I'm server!")+1,0)<0)
  {
  cout<<"send failed!"<<endl;
  return NULL;
  }
  close((int)newSock);
  }
  else
  send((int)newSock,"client full!",strlen("client full!")+1,0);*/
  if(count<=MAXSOCKET)
  {
  while((recv_write=recv((int)newSock,buffer,MAXSIZE,0))!=0)


  {
  if(recv_write==-1)
  {
  cout<<"recieve failed!"<<endl;
  break;
  }
  if(write(get_file,buffer,recv_write)<0)
  {
  cout<<"write failed!"<<endl;
  break;
  }
  bzero(buffer,strlen(buffer));
  }
  // cout<<"recieve end!"<<endl;
  // send((int)newSock,"recieve end!",strlen("recieve end!")+1,0);
  cout<<"receive file success!"<<endl;
  send((int)newSock,"client full!",strlen("client full!")+1,0);

  }
  else
  cout<<"client full!"<<endl;
  count=count-1;
  return(NULL);
}

Client端程序:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <iostream>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#define BUFFER_SIZE 20
using namespace std;
int main(int argc,char *argv[])
{
  int client_file,in_read,send_val,get_addr,clinSock;
  char buffer[BUFFER_SIZE];
  char *local_port,*servIP;
  struct addrinfo addr_info;
  struct addrinfo *p_addrinfo;
  // struct hostent *host;
  if(argc!=4)
  {
  cout<<"Please enter server's information(IP,PORT,FILEPATH):\n";
  exit(1);
  }
  if((client_file=open(argv[3],O_RDONLY))==-1)
  {
  cout<<"File can't find!"<<endl;
  exit(1);
  }
// if((host=gethostbyname(argv[1]))==NULL)
 // {
  // cout<<"Gethostbyname failed!"<<endl;
  // exit(1);
  // }
  servIP = argv[1];
  local_port = argv[2];
  bzero( &addr_info,sizeof(addr_info));
  addr_info.ai_family = AF_UNSPEC;
  // addr_info.ai_flags = AI_PASSIVE;
  addr_info.ai_socktype = SOCK_STREAM;
  addr_info.ai_protocol = IPPROTO_TCP;
  if((get_addr = getaddrinfo(servIP, local_port, &addr_info, &p_addrinfo)) < 0)
  {
  cout<<"getaddinfo failed!"<<endl;
  exit(1);
  }
  clinSock = socket(p_addrinfo->ai_family, p_addrinfo->ai_socktype, p_addrinfo->ai_protocol);
  if(clinSock<0)
  {
  cout<<"socket failed!"<<endl;
  exit(1);
  }
  if((connect(clinSock, p_addrinfo->ai_addr, p_addrinfo->ai_addrlen)) < 0)
  {
  cout<<"connect failed!"<<endl;
  exit(1);
  }
  while((in_read = read(client_file,buffer,sizeof(buffer))) > 0)
  {
  cout<<buffer<<endl;
  send_val = send(clinSock,buffer,in_read,0);
  if(send_val == -1)
  {
  cout<<"send failed!"<<endl;
  break;
  }
  }
  if(in_read < 0)
  cout<<"read failed!"<<endl;
  buffer[in_read]='\0';
  cout<<"send success!"<<endl;
  close(clinSock);
}


[解决办法]
select(serverSock+1,&readfds,NULL,NULL,0)


怎样?

热点排行