int Work::handleMsg(unsigned short id, ByteArray &ba, int fd) { cout<< "Protocol id: "<< id << endl; switch(id) { case 100://--login struct LoginRecvMsg loginRecv; memset(&loginRecv, 0, sizeof(loginRecv)); memcpy(&loginRecv, &ba.buf[ba.getPosition()], sizeof(loginRecv)); cout<<"UserInfo: "<<loginRecv.userID<<" "<<loginRecv.password<<endl; ba.plusPosition(sizeof(loginRecv)); cout<<"position is: "<<ba.getPosition() << " available is: "<<ba.getBytesAvailable() << endl; verifyUserData(loginRecv, fd); // cout<< ba.readUTFBytes(100) << endl; // cout<< ba.readUTFBytes(100) << endl; break; case 200://--register struct RegRecvMsg RegRecv; memset(&RegRecv, 0, sizeof(RegRecv)); memcpy(&RegRecv, &ba.buf[ba.getPosition()], sizeof(RegRecv)); cout<<"UserInfo: "<<RegRecv.userID<<" "<<RegRecv.password<<endl; ba.plusPosition(sizeof(RegRecv)); cout<<"position is: "<<ba.getPosition() << " available is: "<<ba.getBytesAvailable() << endl; verifyRegEvent(RegRecv, fd); break; case 300://--friend list struct FriendListRecvMsg friendListRecv; memset(&friendListRecv, 0, sizeof(friendListRecv)); memcpy(&friendListRecv, &ba.buf[ba.getPosition()], sizeof(friendListRecv)); cout<<"UserID: "<<friendListRecv.userID<<endl; ba.plusPosition(sizeof(FriendListRecvMsg)); cout<<"position is: "<<ba.getPosition() << " available is: "<<ba.getBytesAvailable() << endl; sendFriendList(friendListRecv,fd); break; case 500://---message struct SendMessageRecvMsg recvMsg; memset(&recvMsg, 0, sizeof(recvMsg)); memcpy(&recvMsg, &ba.buf[ba.getPosition()], ba.getBytesAvailable()); cout<<"Send User ID: "<<recvMsg.senderUserID << " Recive User ID: "<<recvMsg.receiverUserID << " Message Info: "<<recvMsg.messageInfo<<endl; ba.plusPosition(ba.getBytesAvailable()); cout<<"position is: "<<ba.getPosition() << " available is: "<<ba.getBytesAvailable() << endl; handleRecvMsgInfo(recvMsg, fd); break; default: cout<<"Unkonwn Protocol " << id << endl; break; } return 0; }
//多客户端拼包和粘包不知道怎么处理。以后解决。 int Work::recvSocket(int fd) { ByteArray ba; int ret = 0; int recvSize = -1; unsigned int totalRecv = 0; do { recvSize = recv(fd, ba.buf, sizeof(ba.buf), 0); cout << "recvSize:: "<<recvSize<<endl; if(recvSize > 0) { totalRecv += recvSize; } ba.setBytesAvailable(totalRecv); ba.setBufLen(totalRecv); }while(recvSize > 0); //假如消息是从头开始接收的 //假如不足四个字节 则不知道怎么处理,所以先要缓存起来 cout<< "total:: "<<ba.getBufLen()<<endl; if(ba.getBufLen() >= 4)//取得消息头和消息长度 等于4的时候是空消息 { len = ba.readUnsignedShort();//取得长度 cout<<"len:: "<<len<<endl; head = ba.readUnsignedShort();//取得协议号 cout<<"head:: "<<head<<endl; if( ba.getBufLen() >= len )//包含了至少一条完整的消息 { cout<<"position is: "<<ba.getPosition() << " available is: "<<ba.getBytesAvailable() << endl; handleMsg(head, ba, fd); } } if(recvSize < 0) { if(errno == EINTR)//还要继续再读 { cout<<"ERRNO IS EINTR"<<endl; ret = 1; } else if(errno == EAGAIN) { cout<<"ERRNO IS EINTR"<<endl; ret = 1; } else { cout<<"socket listen failed ! " << strerror(errno) << endl; ret = - 1; } } else if(recvSize == 0)//正常退出 { cout<<"socket closed failed ! " << strerror(errno) << endl; ret = 0; } else { ret = 1; } return ret; }