📄 zlg_socket.c
字号:
#define SOCKET_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"
/***************************************************************************/
uint8 close(uint8 num)
{
uint8 i;
struct _pkst TxdData;
if(TcpStatus[num].State==TCP_STATE_CLOSED)
{
return (1);
}
else if(TcpStatus[num].State==TCP_STATE_LISTEN)
{
Delete_Socket(num);
return (1);
}
else if(TcpStatus[num].State==TCP_STATE_ESTABLISHED) //主动断开连接
{
TcpStatus[num].SenPassSeq=TcpStatus[num].SenFutureSeq;
TcpStatus[num].SenPassAck=TcpStatus[num].SenPassAck;
TcpStatus[num].SenFutureSeq=TcpStatus[num].SenPassSeq+1;
TcpStatus[num].RecFutureAck=TcpStatus[num].SenPassSeq+1;
TcpHeadHandle(num ,0x5000+TCP_ACK+TCP_FIN);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
TxdData.length=CheckSumTcp1(num,32);//12+28
TcpStatus[num].TcpHeadUint8[16]=(TxdData.length&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=TxdData.length&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
}
else if(TcpStatus[num].State==TCP_STATE_SYN_RCVD)
{
TcpStatus[num].SenPassSeq=TcpStatus[num].SenFutureSeq;
TcpStatus[num].SenPassAck=TcpStatus[num].SenPassAck;
TcpStatus[num].SenFutureSeq=TcpStatus[num].SenPassSeq+1;
TcpStatus[num].RecFutureAck=TcpStatus[num].SenPassSeq+1;
TcpHeadHandle(num ,0x5000+TCP_FIN); //headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
TxdData.length=CheckSumTcp1(num,32); //12+28
TcpStatus[num].TcpHeadUint8[16]=(TxdData.length&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[17]=TxdData.length&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
}
else
{
Delete_Socket(num);
return (1);
}
TcpStatus[num].State=TCP_STATE_FIN_WAIT1;
Delete_Socket(num);
return(0);
}
/***********************************************************************************/
uint8 connect(SOCKET * s, struct sockaddr * addr,uint16 addrlen) //
{
struct _pkst TxdData;
uint8 i=0;
if(TcpStatus[i].State==TCP_STATE_ESTABLISHED)
return(1);
TcpStatus[i].State=TCP_STATE_SYN_SENT;
TcpStatus[i].My_Port=s->My_Port;
TcpStatus[i].Dest_Port=addr->sin_port; //对方端口
TcpStatus[i].Dest_Ip[0]=addr->sin_addr[0];
TcpStatus[i].Dest_Ip[1]=addr->sin_addr[1];
TcpStatus[i].Dest_Ip[2]=addr->sin_addr[2];
TcpStatus[i].Dest_Ip[3]=addr->sin_addr[3];
TcpStatus[i].My_Ip[0]=s->My_Ip[0];
TcpStatus[i].My_Ip[1]=s->My_Ip[1];
TcpStatus[i].My_Ip[2]=s->My_Ip[2];
TcpStatus[i].My_Ip[3]=s->My_Ip[3];
TcpStatus[i].RecPassSeq=0;
TcpStatus[i].RecPassAck=0;
TcpStatus[i].SenPassSeq=781010;
TcpStatus[i].SenPassAck=0;
TcpStatus[i].RecFutureAck=TcpStatus[i].SenPassSeq+1;
TcpStatus[i].SenFutureSeq=TcpStatus[i].SenPassSeq+1;
TcpStatus[i].My_Wl2=TcpStatus[i].SenPassSeq;
TcpStatus[i].Snd_Window=MAX_TCP_DATA; //通知对方本地最大接收1460字节的包,用于流控
TcpStatus[i].My_Max_Seg_Size=MAX_TCP_DATA; //本地机可以接受最大的以太网数据包
TcpHeadHandle(i ,0x7000+TCP_SYN);
//******添加TCP头选项*************//
TcpStatus[i].TcpHeadUint8[20]=0X02;
TcpStatus[i].TcpHeadUint8[21]=0X04;
TcpStatus[i].TcpHeadUint8[22]=MAX_TCP_DATA/256;
TcpStatus[i].TcpHeadUint8[23]=MAX_TCP_DATA%256;
TcpStatus[i].TcpHeadUint8[24]=0X01;
TcpStatus[i].TcpHeadUint8[25]=0X01;
TcpStatus[i].TcpHeadUint8[26]=0X04;
TcpStatus[i].TcpHeadUint8[27]=0X02;
TcpStatus[i].TcpDHeadUint8[2]=0;
TcpStatus[i].TcpDHeadUint8[3]=28;
TxdData.length=CheckSumTcp1(i,40);//12+28
TcpStatus[i].TcpHeadUint8[16]=(TxdData.length&0xff00)>>8;;
TcpStatus[i].TcpHeadUint8[17]=TxdData.length&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=28;
TxdData.DAPTR=TcpStatus[i].TcpHeadUint8;
TcpStatus[i].StaSem=0x02;
i=Send_Ip_Frame
(
&TxdData,
TcpStatus[i].Dest_Ip,
TcpStatus[i].My_Ip,
6
);
return (i);
}
/**************************************************************************************/
SOCKET *socket( uint16 af, uint16 type, uint16 protocol)
{
uint8 i,k=0;
static uint16 port=2000;
Zlg_Socket[k].State=0x50;
Zlg_Socket[k].af=af;
Zlg_Socket[k].type=type;
Zlg_Socket[k].protocol=protocol;
i=0;
if(protocol==TCP_PROTOCOL)
{
do
{
if(TcpStatus[i].My_Port==port)
{
port++;
}
i++;
}
while(i<MAX_TCP_LINKS);
}
else
{
return((SOCKET * )INVALID_SOCKET);
}
Zlg_Socket[k].My_Port=port;
Zlg_Socket[k].My_Ip[0]=NetPort[0].My_Ip[0];
Zlg_Socket[k].My_Ip[1]=NetPort[0].My_Ip[1];
Zlg_Socket[k].My_Ip[2]=NetPort[0].My_Ip[2];
Zlg_Socket[k].My_Ip[3]=NetPort[0].My_Ip[3];
return (&Zlg_Socket[k]);
}
/**************************************************************************************/
int bind( SOCKET * s, struct sockaddr * name,uint16 namelen)
{
s->My_Ip[0]=((struct sockaddr *)name)->sin_addr[0];
s->My_Ip[1]=((struct sockaddr *)name)->sin_addr[1];
s->My_Ip[2]=((struct sockaddr *)name)->sin_addr[2];
s->My_Ip[3]=((struct sockaddr *)name)->sin_addr[3];
s->My_Port=((struct sockaddr *)name)->sin_port;
return 0;
}
/******************************************************************************/
int listen( SOCKET * s, uint16 backlog )
{
uint16 i;
if(backlog>MAX_TCP_LINKS)
return -1;
else if(backlog==0)
return -2;
else if(s->protocol!=0)
return -3;
s->Max_Queue=backlog;
for(i=0;i<MAX_TCP_LINKS;i++)
{
if(TcpStatus[i].State==TCP_STATE_CLOSED)
{
TcpStatus[i].State=TCP_STATE_LISTEN;
s->queue[s->Max_Queue-backlog]=i;
backlog--;
}
if(backlog==0)
break; //如果刚好backlog=MAX_TCP_LINKS,i=MAX_TCP_LINK-1;
}
if(i>=MAX_TCP_LINKS)
{
if(backlog==s->Max_Queue)
{
return -4;
}
i=0;
do
{
TcpStatus[s->queue[i]].State=TCP_STATE_CLOSED;
backlog++;
i++;
}
while(backlog!=s->Max_Queue);
return -4;
}
else
{
s->State=1;
for(i=0;i<s->Max_Queue;i++)
{
TcpStatus[s->queue[i]].My_Ip[0]=s->My_Ip[0];
TcpStatus[s->queue[i]].My_Ip[1]=s->My_Ip[1];
TcpStatus[s->queue[i]].My_Ip[2]=s->My_Ip[2];
TcpStatus[s->queue[i]].My_Ip[3]=s->My_Ip[3];
TcpStatus[s->queue[i]].My_Port=s->My_Port;
TcpStatus[s->queue[i]].StaSem=0x82;
}
}
return (s->Max_Queue);
}
/***********************************************************************************/
uint16 send( uint8 num, uint8 *buf, uint16 len, int flags )
{
struct _pkst TxdData;
uint16 temp;
if((TcpStatus[num].Dest_Max_Seg_Size>=len)&&(TcpStatus[num].State==TCP_STATE_ESTABLISHED))
{
if(TcpStatus[num].SenFutureSeq!=TcpStatus[num].RecPassAck)
{ //对方还没认可
LastData.RepeatTimer=0;//重新开始计时
LastData.Number++;
LastData.State=TURE; //设重发标志
if(LastData.Number>=REPEATNUMBER)
{
LastData.Number=0;
TcpStatus[num].State=TCP_STATE_CLOSED;
LastData.State=FALSE;
return (0);//重发不成功
}
TcpStatus[num].SenPassSeq=TcpStatus[num].RecPassAck;//2007/2/12 对方认可的序号
//TcpStatus[num].SenPassAck=TcpStatus[num].SenPassAck;//我已认可对方的序号
//TcpStatus[num].SenFutureSeq=TcpStatus[num].SenPassSeq+LastData.Length;//如果正确发送,下一次要发送的序号
//TcpStatus[num].RecFutureAck=TcpStatus[num].SenPassSeq+LastData.Length;//等待对方认可的序号
TcpHeadHandle(num ,0x5000+TCP_PSH+TCP_ACK); //headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=((LastData.Length+20)&0XFF00)>>8;
TcpStatus[num].TcpDHeadUint8[3]=(LastData.Length+20)&0X00FF;
memcpy (&(TcpStatus[num].TcpHeadUint8[20]), LastData.Buffer, LastData.Length);//重发
temp=LastData.Length+32;
TxdData.length=CheckSumTcp1(num,temp);//12+20
TcpStatus[num].TcpHeadUint8[16]=(TxdData.length&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[17]=TxdData.length&0x00ff;
}
else
{ //对方已经认可
TcpStatus[num].SenPassSeq=TcpStatus[num].SenFutureSeq;//现在要发送的我的序号
//TcpStatus[num].SenPassAck=TcpStatus[num].SenPassAck;//我已认可对方的序号
TcpStatus[num].SenFutureSeq=TcpStatus[num].SenPassSeq+len;//如果正确发送,下一次要发送的序号
TcpStatus[num].RecFutureAck=TcpStatus[num].SenPassSeq+len;//等待对方认可的序号
TcpHeadHandle(num ,0x5000+TCP_PSH+TCP_ACK);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=((len+20)&0XFF00)>>8;
TcpStatus[num].TcpDHeadUint8[3]=(len+20)&0X00FF;
memcpy (&(TcpStatus[num].TcpHeadUint8[20]), buf, len);
temp=len+32;
TxdData.length=CheckSumTcp1(num,temp);//12+20
TcpStatus[num].TcpHeadUint8[16]=(TxdData.length&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[17]=TxdData.length&0x00ff;
memcpy(&LastData.Buffer[0], buf, len); //备份上次发送的数据
LastData.Length=len;
LastData.RepeatTimer=0;
LastData.Number=0;
LastData.State=TURE; //设重发标志
}
TxdData.STPTR=NULL;
TxdData.length=20+len;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
if(Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
))
return (1); //已经发送出去
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -