416 lines
9.6 KiB
C
416 lines
9.6 KiB
C
#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
|