Exemple #1
0
int connect(int sockfd, const struct sockaddr *serv_addr,socklen_t addrlen,int tmo)
{
//#ifndef _WIN32
	struct timeval	tv;
	fd_set	wset;
	int ret;
	if(tmo==0)
		return connect(sockfd,serv_addr,addrlen);
	return connect(sockfd,serv_addr,addrlen);
/*	state=fcntl(sockfd, F_GETFL, 0);
	fcntl(sockfd, F_SETFL, state|O_NONBLOCK );
*/
	setnoblock(sockfd);
	connect(sockfd,serv_addr,addrlen);
	tv.tv_sec=tmo;
	tv.tv_usec=0;
	FD_ZERO(&wset);
	FD_SET(sockfd,&wset);
	ret = select(sockfd+1,NULL,&wset,NULL,&tv);
//	fcntl(sockfd, F_SETFL, state );
	setblock(sockfd);
	if(ret<=0)
		return -1;
	return 0;
/*#else
	return connect(sockfd,serv_addr,addrlen);
#endif
*/
};
Exemple #2
0
void mysocket::clear_recvq(int len)
{
	if(len<=0)
		return;
	char *str=(char *)malloc(len);
	setnoblock(new_socket);
	::recv(new_socket,str,len,0);
	setblock(new_socket);
	free(str);
}
Exemple #3
0
bool epollx::createlistener(char* szip,unsigned short usport)
{
    m_fdlister = socket(AF_INET,SOCK_STREAM,0);
    if (m_fdlister == -1)
        return false;

    setnoblock(m_fdlister);

    sockaddr_in myaddr = {0};
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(usport);
    if(szip == NULL)
        myaddr.sin_addr.s_addr = INADDR_ANY;
    else
        myaddr.sin_addr.s_addr = inet_addr(szip);

    if (bind(m_fdlister,(sockaddr*)&myaddr,sizeof(myaddr)) == -1)
        return false;

    return listen(m_fdlister,50) != -1;
}
Exemple #4
0
int main()
{
  const char *ip="192.168.84.128";
  int port=8001;
  struct sockaddr_in address;
  bzero(&address,sizeof(struct sockaddr_in));
  address.sin_port=htons(port);
  address.sin_family=AF_INET;
  address.sin_addr.s_addr=inet_addr(ip);
  

  int listenfd=socket(PF_INET,SOCK_STREAM,0);
  if(listenfd<0)
  {
    printf("socket error,%d:%s\n",errno ,strerror(errno));
  }
  if(bind(listenfd,(struct sockaddr*)(&address),sizeof(struct sockaddr))<0)
  {
    printf("bind error,%d:%s\n",errno,strerror(errno));
  }
  if(listen(listenfd,5)<0)
  {
    printf("listen error,%d:%s\n",errno,strerror(errno));
  }
  struct client_data *users=(struct client_data *)calloc(0,sizeof(struct client_data)*FD_LIMIT);
  struct pollfd fds[USER_LIMIT+1];
  int user_count=0;
  int i;
  for(i=1;i<USER_LIMIT+1;++i)
  {
    fds[i].fd=-1;
    fds[i].events=0;
  }
  fds[0].fd=listenfd;
  fds[0].events=POLLIN | POLLERR;
  fds[0].revents=0;


  while(1)
  {
    int ret;
    ret=poll(fds,user_count+1,-1);
    if(ret<0)
    {
      printf("poll error,%d:%s\n",errno,strerror(errno));
      break;
    }
   
    for(i=0;i<user_count+1;++i)
    {
      if((fds[i].fd==listenfd) && (fds[i].revents & POLLIN))
      {
        struct sockaddr_in clientaddress;
        socklen_t clientaddrlength=sizeof(struct sockaddr_in);
        int connfd=accept(listenfd,(struct sockaddr*)(&clientaddress),&clientaddrlength);
        if(connfd<0)
        {
          printf("accept error,%d:%s\n",errno,strerror(errno));
          continue;
        }
        if(user_count>=USER_LIMIT)
        {
          //还有一些没写的,测试的时候不需要之后补上
          continue;
        }
        user_count++;
        users[connfd].address=clientaddress;
        setnoblock(connfd);
        fds[user_count].fd=connfd;
        fds[user_count].revents=0;
        fds[user_count].events=POLLIN | POLLHUP | POLLERR;
        printf("Here comes a new user,now we have %d users\n",user_count);
      }
      else if(fds[i].revents & POLLERR)
      {
        printf("error!");
        continue;
      }
      else if(fds[i].revents & POLLRDHUP)
      {
        continue;
      }
      else if(fds[i].revents & POLLIN)
      {
        int fd=fds[i].fd;
        memset(users[fd].buf,'\0',BUFFER_SIZE);
        ret = recv(fd,users[fd].buf,BUFFER_SIZE-1,0);
        printf("get %d bytes of client data %s form %d\n",ret,users[fd].buf,fd);
        if(ret<0)
        {
          printf("recv error,%d:%s\n",errno,strerror(errno));
          continue;
        }
        else if(ret==0)
        {

        }
        else
        {
          int j;
          for( j = 1;j<=user_count;++j)
          {
            if(fds[j].fd==fd)
            {
              continue;
            }
            fds[j].events |=~POLLIN;
            fds[j].events |=POLLOUT;
            users[fds[j].fd].write_buf=users[fd].buf;
          }
        }
      }
      else if(fds[i].revents & POLLOUT)
      {
        int fd=fds[i].fd;
        if(!users[fd].write_buf)
        {
          continue;
        }
        ret=send(fd,users[fd].write_buf,strlen(users[fd].write_buf),0);
        users[fd].write_buf=NULL;
        fds[i].events |=~POLLOUT;
        fds[i].events |=POLLIN;
      }
    }
  }
  free(users);
  close(listenfd);
  return 0;
}