⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net.c

📁 升级协议接受方教程阿达洒洒萨法萨达洒洒洒洒嗒嗒嗒萨
💻 C
字号:
#include "net.h"

SOCKET hostInit(u_short port)
{
	struct sockaddr_in hostAddr;
	SOCKET sockfd;
	struct in_addr     *ip;
	struct hostent far *host;
	char               name[NAME_SIZE];
	WSADATA wsaData;
	
	WSAStartup( WINSOCK_VERSION , &wsaData ) ;
	sockfd = socket( AF_INET , SOCK_DGRAM , 0 ) ;
	if ( sockfd == INVALID_SOCKET )
	{
		printf( "Create Error----%d\n" , WSAGetLastError() ) ;
		WSACleanup() ;
		return ERROR;
	}
	
	gethostname( name , sizeof(name) ) ;
	host = gethostbyname( name ) ;
	ip = (struct in_addr*)*host->h_addr_list ;
	
	hostAddr.sin_addr   = *ip ;
	hostAddr.sin_family = AF_INET ;
	hostAddr.sin_port   = htons( port ) ;
	
	if ( bind( sockfd , (struct sockaddr*)&hostAddr , sizeof(hostAddr) ) 
		== SOCKET_ERROR)
	{
		printf( "Bind Error----%d\n" , WSAGetLastError() ) ;
		WSACleanup() ;
		return ERROR;
	}
	printf("hostInit successfully!\nLocal IP:%s\n",inet_ntoa(hostAddr.sin_addr));
	return sockfd;
}

void hostShutDown(SOCKET sockfd)
{
	WSACleanup();
	closesocket(sockfd);
}

void makePacket(unsigned char* pktBuf,int seq,unsigned char type,int msgSize,unsigned char *srcMsg)
{
	int i = 0;

	memset( pktBuf,0,PKT_SIZE );
	/*填写序号字段*/
	pktBuf[0] = (seq & 0x00ff);

	/*填写类型字段*/
	pktBuf[SIZE_SEQNUM] = type;

	/*填写信息长度字段*/
	itoa(msgSize,pktBuf+SIZE_SEQNUM+SIZE_TYPE,10);
	/*拷贝数据内容字段*/
	for ( i=0;i<SIZE_MSG_MAX;i++ )
	{
		pktBuf[SIZE_SEQNUM+SIZE_TYPE+SIZE_LENTH+i] = srcMsg[i];
	}
	
	/*计算校验序列*/

	/*填写校验序列字段*/

}

int  sendAndRecv(unsigned char* sendPkt,SOCKET s,struct sockaddr_in* pAddr)
{
	int size = sizeof(struct sockaddr);
	struct timeval tv;
	int res = 0;
	int seqNumSend = INT_ERROR;
	int seqNumRecv = INT_ERROR;
	unsigned char typeRecv = 0x00;
	fd_set rdFds;
	unsigned char recvPkt[PKT_SIZE];

	sendto(s,sendPkt,PKT_SIZE,0,(struct sockaddr*)pAddr,size);
	printf("*********************Msg Send Out!Seq:%d  Type:%d\n",getSeqNum(sendPkt),getType(sendPkt));
	seqNumSend = getSeqNum(sendPkt);
	while (1)
	{		
			tv.tv_sec  = 5;
			tv.tv_usec = 0;
			FD_ZERO(&rdFds);
			FD_SET(s, &rdFds);
			res = select(s+1, &rdFds, NULL, NULL, &tv);
			if(res == SOCKET_ERROR)
			{
				printf("Socket Error on selecting!----%d\n",WSAGetLastError());
				return NEED_STOP;
			}
			else if(res == 0)	//timeout
			{
				printf("Request timed out.\n");
				return NEED_RESEND;
			}
			else if(FD_ISSET(s, &rdFds))
			{
				memset(recvPkt,0,PKT_SIZE);
				res = recvfrom(s,recvPkt,PKT_SIZE,0,(struct sockaddr*)pAddr,&size);
				if (res == SOCKET_ERROR)
				{
					printf("Socket Error on selecting!----%d\n",WSAGetLastError());
					continue;
				}
				seqNumRecv = getSeqNum(recvPkt);
				if (corrupted(recvPkt))
				{
					return NEED_RESEND;
				}
				else if (seqNumSend != seqNumRecv)
				{
					if (seqNumSend == INT_ERROR)
					{
						seqNumSend = seqNumRecv;
					}
					else
					{
						return NEED_RESEND;
					}
				}
				typeRecv = getType(recvPkt);
				if (typeRecv == NO_ENOUGH_MEMORY || typeRecv == NO_ENOUGH_DISK)
				{
					seqNumSend = NEED_STOP;
				}
				return seqNumSend;
			}
		}
}

unsigned char getType(unsigned char *pkt)
{
	return pkt[SIZE_SEQNUM];
}

int  corrupted( unsigned char* pkt )
{
	return 0;
}

int  getSeqNum( unsigned char *pkt )
{
	return (pkt[0] & 0x000000ff);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -