private void BroadcastAddMember(final DataPacket<AddMember> dp) {
		//TODO delete after test
		System.out.println("BroadCast AddMember begin");
		String peopleOnline = "";
		String peopleOffline = "";
		String senderIdentity = dp.getLog().getidentity();
		AddMember newMember = dp.getContent();
		ArrayList<String> members = getAllMembers();
		
		loginInfoLock.lock();
		try {
			for (String memberName : members) {
				if (!memberName.equals(senderIdentity) && !memberName.equals(newMember.getMemberIdentity())) {
					if(clientLoginInfo.containsKey(memberName)) {
						// online, then send to him
						final String receiverIP = clientLoginInfo.get(memberName).getIPAddress();
						(new Thread() {
							public void run() {
								try {
									IHost clientStub = getStub(receiverIP);
									if (clientStub != null)
										clientStub.transferData(dp);
								} catch (Exception e) {
									e.printStackTrace();
								}
							}
						}).start();
						
						peopleOnline += memberName + " ";
					}
					else{
						// offline, then save it
						pushLog.addPushMessage(senderIdentity, memberName, newMember.getApproverSign(),
								P2PMessage.MessageType.AddMember,
								newMember.getMemberIdentity() + "|" + dp.getLog().getLogId());
						peopleOffline += memberName + " ";
					}
				}
			}
		}finally{
			loginInfoLock.unlock();
		}
		
		// TODO: delete after test
		System.out.println("people recv: " + peopleOnline + " people offline: " + peopleOffline);
		
		// return sender a dp packet
		final DataPacket<String> returnDp = new DataPacket<String>(myIP, String.class, OperationType.textMessage);
		final String senderIP = dp.getSenderIP();
		returnDp.setContent("people recv: " + peopleOnline + " people offline: " + peopleOffline);
		(new Thread() {
			public void run() {
				try {
					IHost senderStub = getStub(senderIP);
					if (senderStub != null)
						senderStub.transferData(returnDp);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
	}