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
|