📄 ztcp.c
字号:
void PacketResend(){ int i; for (i=0;i<256;i++) { if ((packettimeleft[i]==0) && (packetconfirm[i]==0)){ packettimeleft[i]=180; if (packetresent[i]==1) packettimeleft[i]=60; if (packetresent[i]==2) packettimeleft[i]=90; if (packetsize[i]>512) packettimeleft[packetnum]=60*3; packetresent[i]++; CopyMemory(&(cpacketdata[2]),&(packetdata[2048*(i & 0x0F)]),packetsize[i]); cpacketdata[0]=1; cpacketdata[1]=(char)i; sendto(ugamesocket,cpacketdata,packetsize[i]+2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); } }}extern void UpdateVFrame(void);int SendData(int dsize,unsigned char *dptr){ int retval; if (UDPEnable){/* retval = sendto(ugamesocket,dptr,dsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } return(0); */ if (((packetnum-packetnumhead) & 0xFF) >= 15){// sprintf(message1,"Packet Overflow.");// MessageBox (NULL, message1, "Init Error" , MB_ICONERROR ); // wait for receive packet, call JoyRead while waiting while (((packetnum-packetnumhead) & 0xFF) >= 15){ PacketResend(); PacketReceive(); UpdateVFrame(); while ((packetconfirm[packetnumhead]) && (packetnum!=packetnumhead)) packetnumhead=(packetnumhead+1) & 0xFF; } } CopyMemory(&(cpacketdata[2]),dptr,dsize); CopyMemory(&(packetdata[2048*(packetnum & 0x0F)]),dptr,dsize); packetsize[packetnum]=dsize; packetconfirm[packetnum]=0; cpacketdata[0]=1; cpacketdata[1]=(char)packetnum; retval = sendto(ugamesocket,cpacketdata,dsize+2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); packettimeleft[packetnum]=60; if (dsize>512) packettimeleft[packetnum]=90; packetresent[packetnum]=1; packetnum=(packetnum+1) & 0xFF; if (retval == SOCKET_ERROR) { closesocket(ugamesocket); return(-1); } return(0); } /* send data with the socket */ retval = send(gamesocket,dptr,dsize,0); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } return(0);}extern int PacketSendSize;extern unsigned char PacketSendArray[2048+256];int SendDataNop(){ return (SendData(PacketSendSize,PacketSendArray));}/**********************************************************\* Send data UDP ** - parameters : ** - size of data ** - pointer to data ** - return 0 on success other value on error ** ** - side effects : ** - close the socket on error *\**********************************************************/int AttachEnd(int psb){ int i,i2,i3,ps;//int PrevSPacket[4];//int PrevSData[4*32];//int PrevSSize[4]; ps=psb; i2=0; for (i=0;i<(UDPBackTrace-1);i++){ if (PrevSPacket[i]) i2++; }// if (PrevSPacket[0]) i2=0; if (i2){ cpacketdata[0]+=8; cpacketdata[ps]=(char)i2; ps++; for (i=0;i<(UDPBackTrace-1);i++){ if (PrevSPacket[i]){ cpacketdata[ps]=PrevSPtr[i]; cpacketdata[ps+1]=PrevSSize[i]; ps+=2; for (i3=0;i3<PrevSSize[i];i3++){ cpacketdata[ps]=PrevSData[i*32+i3]; ps++; } } } for (i=0;i<(UDPBackTrace-2);i++){ PrevSPacket[i]=PrevSPacket[i+1]; PrevSSize[i]=PrevSSize[i+1]; PrevSPtr[i]=PrevSPtr[i+1]; CopyMemory(&(PrevSData[i*32]),&(PrevSData[i*32+32]),32); } } return ps;}int SendDataUDP(int dsize,unsigned char *dptr){ int retval,i; int packetsize;// return (SendData(dsize,dptr)); if (UDPEnable){/*int SendPtr;char SendBuffer[256*32];char SendBufferSize[256];*/ blahblahblah++; packetsize = 0; for (i=0;i<dsize;i++) SendBuffer[SendPtr*32+i]=dptr[i]; SendBufferSize[SendPtr]=dsize; if ((dsize == 2) && (dptr[0]<=1)){ if (SendRepeated < 32) SendRepeated++; cpacketdata[0]=4; cpacketdata[1]=dptr[1]; cpacketdata[2]=(char)SendPtr; cpacketdata[3]=(char)SendPtr2; cpacketdata[4]=(char)SendRepeated; packetsize=5; packetsize=AttachEnd(packetsize); PrevSPacket[UDPBackTrace-2]=0; SendPtr=(SendPtr+1) & 0xFF; if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF; retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } } else { if (SendRepeated){ PrevSPacket[UDPBackTrace-2]=1; PrevSSize[UDPBackTrace-2]=3; PrevSData[(UDPBackTrace-2)*32]=0; PrevSData[(UDPBackTrace-2)*32+1]=dptr[1]; PrevSData[(UDPBackTrace-2)*32+2]=SendRepeated; PrevSPtr[UDPBackTrace-2]=(SendPtr-1) & 0xFF; } SendRepeated=0; cpacketdata[0]=5; cpacketdata[1]=dptr[1]; cpacketdata[2]=SendPtr; cpacketdata[3]=SendPtr2; cpacketdata[4]=dsize; packetsize=5; for (i=0;i<dsize;i++) cpacketdata[i+5]=dptr[i]; packetsize+=dsize; packetsize=AttachEnd(packetsize); PrevSPacket[UDPBackTrace-2]=1; PrevSSize[UDPBackTrace-2]=dsize; for (i=0;i<dsize;i++) PrevSData[(UDPBackTrace-2)*32+i]=dptr[i]; PrevSPtr[UDPBackTrace-2]=SendPtr; SendPtr=(SendPtr+1) & 0xFF; if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF; retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } } return(0); } /* send data with the socket */ retval = sendto(gamesocket,dptr,dsize,0,(struct sockaddr *) &ugameaddress,sizeof(struct sockaddr)); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } return(0);}int SendDataUDPNop(){ return (SendDataUDP(PacketSendSize,PacketSendArray));}/**********************************************************\* Get data left ** - return size left on success negative value on error ** ** - side effects : ** - close the socket on error *\**********************************************************/int GetLeft(){ int retval; int tempsize; retval = ioctlsocket(gamesocket,FIONREAD,&tempsize); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } return(tempsize);}int GetLeftUDP(){ FD_SET_VAR zrf; struct timeval nto; int r; nto.tv_sec=0; nto.tv_usec=0; /* return immediately */ FD_ZERO(&zrf); FD_SET(userversocket,&zrf); r=select(userversocket+1,&zrf,0,0,&nto); if (r == SOCKET_ERROR) { closesocket(userversocket); return(-1); } return(r);}/**********************************************************\* Receive data ** - parameters : ** - size of data ** - pointer to data ** - return size on success negative value on error ** ** - side effects : ** - close the socket on error *\**********************************************************/int GetData(int dsize,unsigned char *dptr){ int retval,i; int dataleft; retval=0; // Temporary UDP routines if (UDPEnable) { PacketResend(); PacketReceive(); i=packetrecvhead; if (packetreceived[i]){ CopyMemory(dptr,&(packetrdata[2048*(i & 0x0F)]),packetreceivesize[i]); retval = packetreceivesize[i]; packetreceived[(i+128) & 0xFF]=0; packetrecvhead=(packetrecvhead+1) & 0xFF; return(retval); } i=RecvPtr; if ((RecvFlags[i]) && (UDPMode2)){ CopyMemory(dptr,&(RecvBuffer[32*i]),RecvBufferSize[i]); retval = RecvBufferSize[i]; RecvFlags[(i+128) & 0xFF]=0; RecvPtr=(RecvPtr+1) & 0xFF; if (!RecvPtr) RecvPtr2=(RecvPtr2+1) & 0xFF; CounterA=90; return(retval); } if ((CounterA==0) & (UDPMode2)){ // Send 16+RecvPtr cpacketdata[0]=16; cpacketdata[1]=RecvPtr; sendto(ugamesocket,cpacketdata,2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress)); CounterA=90; return(0); } return(0); } dataleft=GetLeft(); if(dataleft==0) return(0); if(dataleft<dsize) { dsize=dataleft; } /* get data with the socket */ retval = recv(gamesocket,dptr,dsize,0); if (retval == SOCKET_ERROR) { closesocket(gamesocket); return(-1); } return(retval);}extern unsigned char PacketRecvArray[2048+256];int GetDataNop(){ return (GetData(2048,PacketRecvArray));}void GetHostName(){ HOSTENT* phe; if (!InitTCP()){ strcpy(hostname,"YOUR IP: "); gethostname(blah,255); phe = gethostbyname(blah); strcpy(blah, inet_ntoa(*(struct in_addr*)phe->h_addr)); strcat(hostname,blah); }}void UDPWait1Sec(){ CounterB=60; while (CounterB>0) UpdateVFrame();}void UDPClearVars(){ int i; CounterA=-1; RecvPtr = 0; SendPtr = 0; for (i=0;i<16;i++) PrevSPacket[i]=0; for (i=0;i<256;i++) RecvFlags[i]=0;}void UDPEnableMode(){ UDPMode2=1;}void UDPDisableMode(){ UDPMode2=0;}void WinErrorA2(void){#ifdef __UNIXSDL__ STUB_FUNCTION;#else char message1[256]; sprintf(message1,"Failed waiting for checksum."); MessageBox (NULL, message1, "Init Error" , MB_ICONERROR );#endif}void WinErrorB2(void){#ifdef __UNIXSDL__ STUB_FUNCTION;#else char message1[256]; sprintf(message1,"Failed waiting for confirmation."); MessageBox (NULL, message1, "Init Error" , MB_ICONERROR );#endif}void WinErrorC2(void){#ifdef __UNIXSDL__ STUB_FUNCTION;#else char message1[256]; sprintf(message1,"Failed waiting for confirmation(B)."); MessageBox (NULL, message1, "Init Error" , MB_ICONERROR );#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -