MW22-02A/LWIP/Lib/sock_utils.c

416 lines
9.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "sock_utils.h"
/* Create TCP client socket.
Parameters: pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
Return: success--socket handle; else -1
*/
int CreateTCPClientSock()
{
//struct sockaddr_in sa_cli;
int nRet = -1;
//int err = 0;
nRet = socket(AF_INET, SOCK_STREAM, 0);
if (nRet == -1 )
return -1;
return nRet;
}
/* Create UDP client socket.
Parameters: pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
Return: success--socket handle; else -1
*/
int CreateUDPClientSock()
{
//struct sockaddr_in sa_cli;
int nRet = -1;
nRet = socket(AF_INET, SOCK_DGRAM, 0);
if (nRet == -1 )
return -1;
return nRet;
}
/* Connect to server with server IP, port
Parameters: pServerIP -- Server IP address, can not be NULL
nServerPort -- Server port
sd -- Socket
Return: success--0; else -1
*/
int ClientConnect(int sd, const char * pServerIP, unsigned short nServerPort)
{
struct sockaddr_in sa_serv;
int err = 0;
memset (&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = inet_addr(pServerIP);
sa_serv.sin_port = htons (nServerPort);
err = connect( sd, (struct sockaddr*)&sa_serv, sizeof(sa_serv) );
if (err == -1)
{
return -1;
}
return 0;
}
#if 0
/* Create TCP socket of server, call socket(), bind(), listen()
Parameters: pIP -- The IP server want to bind, if pIP==NULL, bind INADDR_ANY
nPort -- The port server want to bind
nMaxConnect -- the Max connect the server can accept, use by listen()
Return: success--socket handle; else -1, can get last error by errno */
int CreateTCPSrvSock( const char * pIP, unsigned short nPort, int nMaxConnect )
{
struct sockaddr_in sa_serv;
int nRet = -1;
int err = 0;
#ifdef WIN32
WSADATA wsaData;
if (WSAStartup(0x202, &wsaData) != 0)
{
return -1;
}
#endif
nRet = socket(AF_INET, SOCK_STREAM, 0);
if (nRet == -1 )
return -1;
memset (&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
if( ( pIP != NULL )&& ( pIP[0] != 0 ))
sa_serv.sin_addr.s_addr = inet_addr(pIP);
else
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons (nPort); /* Server Port number */
err = bind(nRet, (struct sockaddr*) &sa_serv, sizeof (sa_serv));
if (err == -1)
{
CloseSocket( nRet );
return -1;
}
err = listen (nRet, nMaxConnect );
if (err == -1)
{
CloseSocket( nRet );
return -1;
}
return nRet;
}
/* Create UDP socket of server, call socket(), bind()
Parameters: pIP -- The IP server want to bind, if pIP==NULL, bind INADDR_ANY
nPort -- The port server want to bind
Return: success--socket handle; else -1, can get last error by errno */
int CreateUDPSrvSock( const char * pIP, unsigned short nPort )
{
struct sockaddr_in sa_serv;
int nRet = -1;
int err = 0;
#ifdef WIN32
WSADATA wsaData;
if (WSAStartup(0x202, &wsaData) != 0)
{
return -1;
}
#endif
nRet = socket(AF_INET, SOCK_DGRAM, 0);
if (nRet == -1 )
return -1;
memset (&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
if( ( pIP != NULL )&& ( pIP[0] != 0 ))
sa_serv.sin_addr.s_addr = inet_addr(pIP);
else
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons (nPort); /* Server Port number */
err = bind(nRet, (struct sockaddr*) &sa_serv, sizeof (sa_serv));
if (err == -1)
{
CloseSocket( nRet );
return -1;
}
return nRet;
}
/* Accept connect from client, format client IP to string, call accept()
Parameters: szClientIP -- If accept suceess, return client IP in this buffer, format: xxx.xxx.xxx.xxx
pPort -- If accept suceess, return client port
Return: success--new socket handle; else -1
*/
int SockAccept( int Socket, char szClientIP[20], unsigned short *pPort)
{
struct sockaddr_in sa_cli;
size_t client_len;
unsigned char * p = NULL;
int sd;
client_len = sizeof(sa_cli);
sd = accept (Socket, (struct sockaddr*) &sa_cli, &client_len);
if (sd == -1)
return -1;
p = (unsigned char *)(&(sa_cli.sin_addr.s_addr));
sprintf(szClientIP, "%d.%d.%d.%d", *p, *(p+1), *(p+2), *(p+3));
*pPort = ntohs( sa_cli.sin_port );
return sd;
}
/*
Parameters: timeout--0 wait forever, >0 timeout limit( second )
Return: Socket handle is ready -- >=1; timeout -- 0; socket error -- <0 */
int SockSelect( int sockfd, int timeout )
{
fd_set rfds;
struct timeval tv;
FD_ZERO( &rfds );
FD_SET( sockfd, &rfds );
if( timeout > 0 )
{
tv.tv_sec = timeout;
tv.tv_usec = 0;
return select( sockfd + 1, &rfds, NULL, NULL, &tv );
}
else
return select( sockfd + 1, &rfds, NULL, NULL, NULL );
}
/* Create TCP client socket.
Parameters: pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
Return: success--socket handle; else -1
*/
int CreateTCPClientSock( const char * pLocalIP )
{
struct sockaddr_in sa_cli;
int nRet = -1;
int err = 0;
#ifdef WIN32
WSADATA wsaData;
if (WSAStartup(0x202, &wsaData) != 0)
{
return -1;
}
#endif
nRet = socket(AF_INET, SOCK_STREAM, 0);
if (nRet == -1 )
return -1;
if( ( pLocalIP != NULL )&& ( pLocalIP[0] != 0 ))
{
memset (&sa_cli, '\0', sizeof(sa_cli));
sa_cli.sin_family = AF_INET;
sa_cli.sin_addr.s_addr = inet_addr(pLocalIP);
sa_cli.sin_port = htons (0); /* Server Port number */
err = bind(nRet, (struct sockaddr*) &sa_cli, sizeof (sa_cli));
if (err == -1)
{
CloseSocket( nRet );
return -1;
}
}
return nRet;
}
/* Create UDP client socket.
Parameters: pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
Return: success--socket handle; else -1
*/
int CreateUDPClientSock( const char * pLocalIP )
{
struct sockaddr_in sa_cli;
int nRet = -1;
int err = 0;
nRet = socket(AF_INET, SOCK_DGRAM, 0);
if (nRet == -1 )
return -1;
if( ( pLocalIP != NULL )&& ( pLocalIP[0] != 0 ))
{
memset (&sa_cli, '\0', sizeof(sa_cli));
sa_cli.sin_family = AF_INET;
sa_cli.sin_addr.s_addr = inet_addr(pLocalIP);
sa_cli.sin_port = htons (0); /* Server Port number */
err = bind(nRet, (struct sockaddr*) &sa_cli, sizeof (sa_cli));
if (err == -1)
{
CloseSocket( nRet );
return -1;
}
}
return nRet;
}
/* Connect to server with server IP, port
Parameters: pServerIP -- Server IP address, can not be NULL
nServerPort -- Server port
sd -- Socket
Return: success--0; else -1
*/
int ClientConnect( const char * pServerIP, unsigned short nServerPort, int sd )
{
struct sockaddr_in sa_serv;
int err = 0;
memset (&sa_serv, '\0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = inet_addr(pServerIP);
sa_serv.sin_port = htons (nServerPort); /* Server Port number */
err = connect( sd, (struct sockaddr*)&sa_serv, sizeof(sa_serv) );
if (err == -1)
{
return -1;
}
return 0;
}
/* Connect to server with server IP, port in time
Parameters: pServerIP -- Server IP address, can not be NULL
nServerPort -- Server port
sd -- Socket handle
nTimeout -- Timeout(second)
Return: success--socket handle; else -1
*/
int ClientConnect_Intime( const char * pServerIP, unsigned short nServerPort,
int sd, int nTimeout )
{
int ret;
#ifndef WIN32
signal_handle_t OldFuncPtr = signal(SIGALRM, key_timeout);
#endif
_ALARM(nTimeout);
if( ( SET_JMP(key_env) ) != 0)
{
_ALARM( 0 );
#ifndef WIN32
signal( SIGALRM, OldFuncPtr );
#endif
return -2;//out time
}
ret = ClientConnect( pServerIP, nServerPort, sd );
_ALARM(0);
#ifndef WIN32
signal( SIGALRM, OldFuncPtr );
#endif
return ret;
}
/* Connect to server with server IP, port
Parameters: pServerIP -- Server IP address, can not be NULL
nServerPort -- Server port
pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
Return: success--socket handle; else -1
*/
int ConnectTo( const char * pServerIP, unsigned short nServerPort, const char * pLocalIP )
{
int nRet = -1;
nRet = CreateTCPClientSock( pLocalIP );
if( nRet < 0 ) return nRet;
if( ClientConnect( pServerIP, nServerPort, nRet ) != 0 )
{
CloseSocket( nRet );
return -1;
}
return nRet;
}
/* Connect to server with server IP, port in time
Parameters: pServerIP -- Server IP address, can not be NULL
nServerPort -- Server port
pLocalIP -- Local IP address, if you don't bind local IP, set it as NULL
nTimeout -- Timeout(second)
Return: success--socket handle; else -1
*/
int ConnectTo_Intime( const char * pServerIP, unsigned short nServerPort,
const char * pLocalIP,int nTimeout )
{
int nRet = -1;
if( ClientConnect_Intime( pServerIP, nServerPort, nRet, nTimeout ) != 0 )
{
CloseSocket( nRet );
return -1;
}
return nRet;
}
/* Receive fixed length data from socket
like as recv but no pipe broken
* */
int SockRecv(int sd, void *buff, int len)
{
return recv(sd, buff, len, MSG_NOSIGNAL);
}
/* Receive fixed length data from socket
* Parameters: timeout -- 0 wait forever, >0 timeout limit( second )
* return : OK >=1; timeout -- 0; socket error -- <0
* */
int SockRecvFixLen(int sd, void *buff, int fix_len, int timeout)
{
int len = 0, sum = 0;
int ret;
while( sum < fix_len ){
ret = SockSelect(sd, timeout);
if( ret <= 0 )
return ret;
len = recv(sd, buff+sum, fix_len - sum, MSG_NOSIGNAL);
if(len < 0)
return len;
if(len == 0) //Peer closed
return -1;
sum += len;
};
return sum;
}
int SockSendFixLen(int sock, void *buff, int len)
{
int offset = 0;
while(len){
int c = send(sock, buff+offset, len, MSG_NOSIGNAL);
//2009-07-04, <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>send<6E><64><EFBFBD><EFBFBD><EFBFBD>߶Ϻ󲻷<CFBA><F3B2BBB7>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>
//int c = send(sock, buff+offset, len, 0);
//if(c <= 0)
// printf("send return bad result: %d\n", c);
if(c < 0)
return c;
len -= c;
offset += c;
}
return offset;
}
#endif