📄 net.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 + -