📄 zlg_socket.c
字号:
#define SOCKET_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"
#define SOCKET_ERROR 0xff
uint8 close(uint8 num)
{
uint8 err,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;
for(i=0;i<5;i++)
{
OSSemPend(AppSemDisc[num],100,&err);
if(err==OS_NO_ERR)
{
Delete_Socket(num);
return (1);
}
else
{
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
}
}
Delete_Socket(num);
return(0);
}
uint8 connect(SOCKET * s, struct sockaddr * addr,uint16 addrlen) //
{
struct _pkst TxdData;
uint8 i,j,err;
for(i=0;i<MAX_TCP_LINKS;i++)
{
if(TcpStatus[i].State>=TCP_STATE_LISTEN)
{
if(TcpStatus[i].Dest_Ip[0]==addr->sin_addr[0])
if(TcpStatus[i].Dest_Ip[1]==addr->sin_addr[1])
if(TcpStatus[i].Dest_Ip[2]==addr->sin_addr[2])
if(TcpStatus[i].Dest_Ip[3]==addr->sin_addr[3])
if(TcpStatus[i].My_Ip[0]==s->My_Ip[0])
if(TcpStatus[i].My_Ip[1]==s->My_Ip[1])
if(TcpStatus[i].My_Ip[2]==s->My_Ip[2])
if(TcpStatus[i].My_Ip[3]==s->My_Ip[3])
if(s->My_Port==TcpStatus[i].My_Port)
if(addr->sin_port==TcpStatus[i].Dest_Port)
{
if(TcpStatus[i].State==TCP_STATE_ESTABLISHED)
return (i);
else
close (i);
//Delete_Socket(i);
}
}
}
j=0;
do
{
OS_ENTER_CRITICAL();
for(i=0;i<MAX_TCP_LINKS;i++)
{
if(TcpStatus[i].State==TCP_STATE_CLOSED)
{
TcpStatus[i].State=TCP_STATE_SYN_SENT;
break;
}
}
OS_EXIT_CRITICAL();
if(i>=MAX_TCP_LINKS)
return (MAX_TCP_LINKS);//连接已经满了
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;//通知对方本地最大接收1024字节的包,用于流控
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;
Send_Ip_Frame
(
&TxdData,
TcpStatus[i].Dest_Ip,
TcpStatus[i].My_Ip,
6
);
OSSemPend(AppSemCon[i],100,&err);//挂起,等待SYN_ACK信号的成功接收
if(err==OS_NO_ERR)
{
//TcpStatus[i].State=TCP_STATE_ESTABLISHED;
return(i);
}
if(TcpStatus[i].State==TCP_STATE_SYN_SENT)
if(TcpStatus[i].Dest_Ip[0]==addr->sin_addr[0])
if(TcpStatus[i].Dest_Ip[1]==addr->sin_addr[1])
if(TcpStatus[i].Dest_Ip[2]==addr->sin_addr[2])
if(TcpStatus[i].Dest_Ip[3]==addr->sin_addr[3])
if(TcpStatus[i].My_Ip[0]==s->My_Ip[0])
if(TcpStatus[i].My_Ip[1]==s->My_Ip[1])
if(TcpStatus[i].My_Ip[2]==s->My_Ip[2])
if(TcpStatus[i].My_Ip[3]==s->My_Ip[3])
if(s->My_Port==TcpStatus[i].My_Port)
if(addr->sin_port==TcpStatus[i].Dest_Port)
{
Delete_Socket(i);
}
j++;
}while(j<3);
Delete_Socket(i);
return(MAX_TCP_LINKS);//退出返回连接失败。
}
SOCKET *socket( uint16 af, uint16 type, uint16 protocol)
{
uint8 i,j,k;
static uint16 port=1025;
OS_ENTER_CRITICAL();
for(k=0;k<MAX_SOCKETS;k++)
if(Zlg_Socket[k].State==0)
break;
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 if(protocol==UDP_PROTOCOL)
{
j=0;
do
{
if(UdpStatus[i].My_Port==port)
{
port++;
}
i++;
}while(i<MAX_UDP_LINKS);
do
{
if(UdpStatus[j].My_Port==0)
{
break;
}
j++;
}while(j<MAX_UDP_LINKS);
if(j>=MAX_UDP_LINKS)
{
OS_EXIT_CRITICAL();
return ((SOCKET * )INVALID_SOCKET);
}
Zlg_Socket[k].Udp_Queue=j;
UdpStatus[j].My_Port=port;
UdpStatus[j].My_Ip[0]=NetPort[0].My_Ip[0];
UdpStatus[j].My_Ip[1]=NetPort[0].My_Ip[1];
UdpStatus[j].My_Ip[2]=NetPort[0].My_Ip[2];
UdpStatus[j].My_Ip[3]=NetPort[0].My_Ip[3];
}
else
{
OS_EXIT_CRITICAL();
return((SOCKET * )INVALID_SOCKET);
}
Zlg_Socket[k].My_Port=port;
port++;
if(port>=5000)
port=1025;
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];
OS_EXIT_CRITICAL();
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;
if(s->protocol==UDP_PROTOCOL)
{
UdpStatus[s->Udp_Queue].My_Port=((struct sockaddr *)name)->sin_port;
UdpStatus[s->Udp_Queue].My_Ip[0]=((struct sockaddr *)name)->sin_addr[0];
UdpStatus[s->Udp_Queue].My_Ip[1]=((struct sockaddr *)name)->sin_addr[1];
UdpStatus[s->Udp_Queue].My_Ip[2]=((struct sockaddr *)name)->sin_addr[2];
UdpStatus[s->Udp_Queue].My_Ip[3]=((struct sockaddr *)name)->sin_addr[3];
return 1;
}
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;
OS_ENTER_CRITICAL();
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)
{
OS_EXIT_CRITICAL();
return -4;
}
i=0;
do
{
TcpStatus[s->queue[i]].State=TCP_STATE_CLOSED;
backlog++;
i++;
}
while(backlog!=s->Max_Queue);
memset(&s, 0, sizeof(s));
OS_EXIT_CRITICAL();
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;
}
}
OS_EXIT_CRITICAL();
return (s->Max_Queue);
}
uint8 accept( SOCKET * s, struct sockaddr *addr, int *addrlen )
{
uint16 i;
uint8 err;
uint16 sock_addrlen;
if(s->protocol!=0)
return (0XFF);
if(s->Max_Queue==0)
return (0XFF);
for(i=0;i<s->Max_Queue;i++)
{
if(OSSemAccept(AppSemCon[s->queue[i]]))
{
break;
}
}
if(i>=s->Max_Queue)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -