// direct send to direct recv void test1(Chan *c) { changeNproc(2); go( mySend(c) ); go( myRecv(c) ); }
// direct send to select recv void test2(int c) { Chan **ca = mkchan(c, 4); changeNproc(4); go( mySend(ca[0]) ); go( mySend(ca[1]) ); go( mySend(ca[2]) ); go( mySend(ca[3]) ); changeNproc(1); go( sel(ca[0], ca[1], ca[2], ca[3], nc, nc, nc, nc) ); }
int dealChannel(char *recvBuffer, size_t bufferSize, size_t recvSize, int cliSock) { short sSrvChanSerial; unsigned short ulChannelSerial; int nErrorCode = 1; char sendBuffer[MAX_FRAME]; int nRes; int errCode; if( ( nRes = MHttp::GetChannel(recvBuffer, recvSize, sSrvChanSerial, ulChannelSerial, nErrorCode) ) < 0) { printf("SRV:获取连接信息出错\n"); return -1; } memset(sendBuffer, '\0', sizeof(sendBuffer)); //将解析出来的包中的相关信息返回给客户端 if( (nRes = MHttp::BuildChannel(sendBuffer, MAX_FRAME, sSrvChanSerial, ulChannelSerial, nErrorCode)) < 0 ) { printf("SRV:TP_CHANNEL:BuildChannel Error[%d]", nRes); return -2; } if((errCode = mySend(cliSock, sendBuffer, nRes)) != nRes) { printf("SRV:TP_CHANNEL::SendError[%d]\n", errCode); return -3; } return 0; }
void test6(int c) { Chan **ca = mkchan(c, 12); changeNproc(4); go( mySend(ca[4]) ); go( mySend(ca[5]) ); go( mySend(ca[6]) ); go( mySend(ca[7]) ); changeNproc(4); go( myRecv(ca[8]) ); go( myRecv(ca[9]) ); go( myRecv(ca[10]) ); go( myRecv(ca[11]) ); changeNproc(2); go( sel(ca[4], ca[5], ca[6], ca[7], ca[0], ca[1], ca[2], ca[3]) ); go( sel(ca[0], ca[1], ca[2], ca[3], ca[8], ca[9], ca[10], ca[11]) ); }
int dealTradeUnit(char *recvBuffer, size_t bufferSize, size_t recvSize, THREAD_PARAM *param) { unsigned short usUnitSerial; unsigned long ulLinkNo; char szIPSource[255] = {'\0'}; //域名解析时用到的一个临时变量 char szIP[255] = {'\0'}; //中途的HTTP代理使用 unsigned short usPort = 0; int nErrorCode = 1; int nRes; char sendBuffer[MAX_FRAME] = {'\0'}; if( ( nRes = MHttp::GetTradeUnit(recvBuffer, recvSize, usUnitSerial, ulLinkNo, szIPSource, usPort, nErrorCode) ) < 0) { printf("Srv:GetTradeUnit Error[%d]\n", nRes); return -1; } //存储GCLNKNO与序号(GCLNKNO与序号在我们向客户端回复数据时,组包时要用到这两个字段) param->ulLinkNo = ulLinkNo; param->usUnitSerial = usUnitSerial; //域名转换 DNSToIP(szIPSource, sizeof(szIPSource), szIP, sizeof(szIP)-1); //这儿是阻塞的 if((nRes = myConnect(param->srvSocket, szIP, usPort)) < 0) { printf("SRV:Unit::connect[%s:%d]Error[%d]\n", szIP, usPort, nRes); return -2; } //设置为委拖,并设置委托状态为初始化状态 assert(param->isConnected == 0); param->isTrade = true; param->tradeState = TS_AUTH; //param->isConnected = 1; if( (nRes = MHttp::BuildTradeUnit(sendBuffer, MAX_FRAME, usUnitSerial, ulLinkNo, szIP, usPort, nErrorCode)) < 0 ) { printf("Srv:BuildTradeUnit Error[%d]\n", nRes); return -3; } if((nErrorCode = mySend(param->cliSocket, sendBuffer, nRes)) != nRes) { printf("SRV:TP_CHANNEL::SendError[%d]\n", nErrorCode); return -3; } return 0; }
int myHttpSend(int s, char *buffer, size_t size, THREAD_PARAM *param) { char tmpBuffer[10240]; int errCode; errCode = MHttp::BuildData(tmpBuffer, sizeof(tmpBuffer), param->usUnitSerial, param->ulLinkNo, buffer, size); if(mySend(s, tmpBuffer, errCode) != errCode) { printf("httpSend Error\n"); return -1; } return size; }
int dealData(char *recvBuffer, size_t bufferSize, size_t recvSize, THREAD_PARAM *param) { int nRes; unsigned short usUnitSerial; unsigned long ulLinkNo; int nDataStart, nDataSize; if( ( nRes = MHttp::GetData(recvBuffer, recvSize, usUnitSerial, ulLinkNo, nDataStart, nDataSize) ) < 0) { printf("SRV:GetData Error[%d]\n", nRes); return -1; } if( nDataStart > recvSize || nDataSize > (recvSize-nDataStart)) { printf("SRV:GetData提取的数据错误\n"); return -2; } if(param->srvSocket == INVALID_SOCKET) { printf("SRV:还没建立单元信息\n"); return -3; } if(param->isTrade && param->tradeState != TS_DONE) { nRes = dealTradeData(recvBuffer+nDataStart, nDataSize, param); if(nRes != 0) { printf("处理委托部份数据出错[%d]\n", nRes); return -5; } return 0; } printf("开始发普通数据\n"); if((nRes = mySend(param->srvSocket, recvBuffer + nDataStart, nDataSize)) != nDataSize) { printf("SRV:Data::发送数据失败[%d]\n", nRes); return -4; } return 0; }
int ServerItem::sendErr(TFTP_ERROR_CODE errorcode) { char x[100]; package *pac = (package *)x; pac->opCode = htons(TFTP_OP_ERR); pac->code = htons(errorcode); switch (errorcode) { case TFTP_ERR_UNDEFINED: strcpy(x + 4, "tftp error undefined!"); break; case TFTP_ERR_FILE_NOT_FOUND: strcpy(x + 4, "tftp error file not found!"); break; case TFTP_ERR_ACCESS_DENIED: strcpy(x + 4, "tftp error access denied!"); break; case TFTP_ERR_DISK_FULL: strcpy(x + 4, "tftp error disk full!"); break; case TFTP_ERR_UNEXPECTED_OPCODE: strcpy(x + 4, "tftp error unexpected opcode!"); break; case TFTP_ERR_UNKNOWN_TRANSFER_ID: strcpy(x + 4, "tftp error unknown transfer id!"); break; default: break; } convert(x + 4); int ret = mySend(x, strlen(x + 4) + 5); if (ret == SOCKET_ERROR) { cout << "sendErr() failed!" << endl; } string xx = string(); xx.append(inet_ntoa(this->addr.sin_addr)); xx.append(" Error sent: \t"); xx.append(x + 4); logMessage((char *)xx.c_str()); #ifdef _DEBUG_MODE cout << "Err: " << inet_ntoa(addr.sin_addr) << " " << x + 4 << endl; #endif return ret; }
int ServerItem::sendACK(unsigned short index) { char x[4]; package *pac = (package *)x; pac->opCode = htons(TFTP_OP_ACK); pac->code = htons(index); int ret = mySend(x, 4); if (ret == SOCKET_ERROR) { cout << "ack error!" << endl; } string xx = string(); xx.append(inet_ntoa(this->addr.sin_addr)); xx.append(" ACK sent"); logMessage((char *)xx.c_str()); return ret; }
int ServerItem::sendPackage(int index) { if (fp == NULL) { return -2; } char *data = (char *)malloc(blksize + 4); if (index != packageIndex + 1) fseek(fp, (int)(index - 1) * blksize, 0); package *op = (package *)data; op->opCode = htons(TFTP_OP_DATA); op->code = htons((unsigned short)index); int ret = fread(data + 4, 1, blksize, fp); if (ret < 0) { int ret = sendErr(TFTP_ERR_UNDEFINED); } else { if (ret < blksize) { finished = true; } int rett = mySend(data, ret + 4); if (rett < 0) { finished = false; } else { if (finished) { packageIndex = index; } } string x = string(); x.append(inet_ntoa(addr.sin_addr)); x.append(" Package sent: \t"); char aa[5]; itoa(rett, aa, 10); x.append(aa); logMessage((char *)x.c_str()); packageIndex = index; } return 0; }
epicsShareFunc int epicsShareAPI epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout) { return mySend(pmsg, message, size, true, true, timeout); }
epicsShareFunc int epicsShareAPI epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message, unsigned int size) { return mySend(pmsg, message, size, true, false, 0.0); }
int dealTradeData(char *recvBuffer, size_t bufferSize, THREAD_PARAM *param) { char tmpBuffer[1024] = {'\0'}; int nRes; memcpy(param->tradeBuffr, recvBuffer, bufferSize); param->hadUsed += bufferSize; if(param->tradeBuffr[0] != '#') { printf("第一个字节不为#,非法了\n"); return -1; } if(param->tradeState == TS_AUTH) { IPOS_HEAD* pHead = (IPOS_HEAD*)tmpBuffer; CU_CHECKREPLY* pCheckReply = (CU_CHECKREPLY*)(tmpBuffer+sizeof(IPOS_HEAD)); //note:这儿????????? if( param->hadUsed < (sizeof(IPOS_HEAD)+sizeof(UC_CHECK)) ) { printf("委托认证包还没收全\n");//test point return -1; //继续等待 } param->hadUsed -= (sizeof(IPOS_HEAD)+sizeof(UC_CHECK)); if(param->hadUsed > 0) { printf("f**k 收到的数据大了一点\n"); memmove(param->tradeBuffr, param->tradeBuffr+sizeof(IPOS_HEAD)+sizeof(UC_CHECK), param->hadUsed); }else{ ;//printf("f**k 收到的数据刚好那么多了嘛\n");//test point } pHead->Flag = '#'; //IP数据包起始标志'#',SerialPort数据包起始标志'0xFF' pHead->Ver = IPOSVER; //版本号 pHead->sendDataLength = 0; //编码之后数据头后的发送数据包长度 pHead->Type = TYPE_CU_CHECKREPLY; //数据包类型 pHead->DataLength = sizeof(CU_CHECKREPLY); pHead->Chk = 0; pCheckReply->Reply = CERTIFY_SUCCESS; pCheckReply->Chk = 0; if((nRes = myHttpSend(param->cliSocket, tmpBuffer, sizeof(IPOS_HEAD)+sizeof(CU_CHECKREPLY), param)) != sizeof(IPOS_HEAD)+sizeof(CU_CHECKREPLY)) { printf("CLI:Data::向客户端回数据失败[%d]\n", nRes); return -4; } param->tradeState = TS_CONNECT; //置状态 }else if(param->tradeState == TS_CONNECT) { if( param->hadUsed < (sizeof(IPOS_HEAD)+sizeof(UC_CLIENTINFO)) ) { printf("委托连接包还没收全\n"); return -1; //继续等待 } param->hadUsed -= (sizeof(IPOS_HEAD)+sizeof(UC_CLIENTINFO)); if( param->hadUsed > 0 ) { printf("送的连接包里面带有其它数据\n"); memmove(param->tradeBuffr, param->tradeBuffr+(sizeof(IPOS_HEAD)+sizeof(UC_CLIENTINFO)), param->hadUsed); }else{ } IPOS_HEAD* pHead = (IPOS_HEAD*)tmpBuffer; CU_CHECKREPLY* pConnectReply = (CU_CHECKREPLY*)(tmpBuffer+sizeof(IPOS_HEAD)); pHead->Flag = '#'; //IP数据包起始标志'#',SerialPort数据包起始标志'0xFF' pHead->Ver = IPOSVER; //版本号 pHead->sendDataLength = 0; //编码之后数据头后的发送数据包长度 pHead->Type = TYPE_CU_CONNECTREPLY; //数据包类型 pHead->DataLength = sizeof(CU_CHECKREPLY); pHead->Chk = 0; pConnectReply->Reply = CONNECT_SUCCESS; pConnectReply->Chk = 0; if((nRes = myHttpSend(param->cliSocket, tmpBuffer, sizeof(IPOS_HEAD)+sizeof(CU_CHECKREPLY), param)) != sizeof(IPOS_HEAD)+sizeof(CU_CHECKREPLY)) { printf("CLI:Data::向客户端回CONN数据失败[%d]\n", nRes); return -4; } pHead = (IPOS_HEAD*)tmpBuffer; UC_CLIENTINFO* pClientInfo = (UC_CLIENTINFO*)(tmpBuffer+sizeof(IPOS_HEAD)); pHead->Flag = '#'; //IP数据包起始标志'#',SerialPort数据包起始标志'0xFF' pHead->Ver = IPOSVER; //版本号 pHead->sendDataLength = 0; //编码之后数据头后的发送数据包长度 pHead->Type = TYPE_UC_CLIENTINFO; //数据包类型 pHead->DataLength = sizeof(UC_CLIENTINFO); pHead->Chk = 0; pClientInfo->IpAddr.s_addr = inet_addr(param->cliIP); pClientInfo->Port = htons(param->cliPort); pClientInfo->Chk = 0; if((nRes = mySend(param->srvSocket, tmpBuffer, sizeof(IPOS_HEAD)+sizeof(UC_CLIENTINFO))) != sizeof(IPOS_HEAD)+sizeof(UC_CLIENTINFO)) { printf("Trade[%d][%s]\n", strlen(tmpBuffer), tmpBuffer); printf("CLI:Data::向服务器发Conn数据失败[%d]\n", nRes); return -4; } if(param->hadUsed > 0) { printf("有遗留数据\n"); if((nRes = mySend(param->srvSocket, param->tradeBuffr, param->hadUsed)) != param->hadUsed) { printf("CLI:Data::向服务器发尾部数据失败[%d]\n", nRes); return -4; } }else { printf("没得遗留数据\n"); } param->tradeState = TS_DONE; param->isConnected = 1; }else{ assert(0); return -1; } return 0; }