Beispiel #1
1
// direct send to direct recv
void test1(Chan *c) {
	changeNproc(2);
    
    go( mySend(c) );
    go( myRecv(c) );
}
Beispiel #2
0
// 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) );
}
Beispiel #3
0
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;
}
Beispiel #4
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]) );
}
Beispiel #5
0
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;
}
Beispiel #6
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;
}
Beispiel #7
0
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;
}
Beispiel #8
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;
}
Beispiel #9
0
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;
}
Beispiel #10
0
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);
}
Beispiel #13
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;
}