1.socket流式套接字选项设置:
客户端代码示例:
int UnionCreateSocketClient(char *ip,int port)
{
struct sockaddr_in psckadd;
int sckcli;
struct linger Linger;
int on=1;
if (ip == NULL)
{
UnionUserErrLog("in UnionCreateSocketClient:: NULL IPAddress!\n");
return(UnionErrNullIPAddressPassed);
}
if (port < 0)
{
UnionUserErrLog("in UnionCreateSocketClient:: Minus Socket Port [%d]!\n",port);
return(UnionErrMinusSocketPortPassed);
}
memset((char *)(&psckadd),'0',sizeof(struct sockaddr_in));
psckadd.sin_family = AF_INET;
psckadd.sin_addr.s_addr = inet_addr(ip);
psckadd.sin_port=htons((u_short)port);
if ((sckcli = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: socket! IP = [%s] port = [%d]\n",ip,port);
return(UnionErrCallingSocket);
}
if (setjmp(UnionCreateSckCliJmpEnv) != 0)
{
UnionUserErrLog("in UnionCreateSocketClient:: Timeout!\n");
alarm(0);
close(sckcli);
return(-1);
}
alarm(30);
signal(SIGALRM,UnionDealCreateSckCliTimeout);
if (connect(sckcli,(struct sockaddr *)(&psckadd),sizeof(struct sockaddr_in)) < 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: connect! IP = [%s] port = [%d]\n",ip,port);
//shutdown(sckcli,2);
close(sckcli);
alarm(0);
return(UnionErrCallingConnect);
}
Linger.l_onoff = 1;
Linger.l_linger = 0;
if (setsockopt(sckcli,SOL_SOCKET,SO_LINGER,(char *)&Linger,sizeof(Linger)) != 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt linger!");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
if (setsockopt(sckcli, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt SO_OOBINLINE!\n");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
on = 1;
if (setsockopt(sckcli, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on)))
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt: TCP_NODELAY");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
alarm(0);
return(sckcli);
}
服务器套接字设置:
int UnionInitializeTCPIPServer(int port)
{
struct sockaddr_in serv_addr;
int scksvr;
int ret;
int reuse;
unsigned int clilen;
struct sockaddr_in cli_addr;
struct linger Linger;
int gunionSckInstance
// Initialize the socket
memset((char *)(&serv_addr), 0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons((u_short)port);
if ((scksvr = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: socket()!\n");
return(errCodeUseOSErrCode);
}
reuse = 1;
if ((ret = setsockopt(scksvr, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(int))) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: setsockopt()!\n");
UnionCloseSocket(scksvr);
return(errCodeUseOSErrCode);
}
if (bind(scksvr,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr_in)) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: bind()!\n");
return(errCodeUseOSErrCode);
}
// Listen to new-coming connecting request
if ( listen(scksvr, 10000) < 0 )
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: listen()!\n");
return(errCodeUseOSErrCode);
}
clilen = sizeof(cli_addr);
gunionSckInstance = accept(scksvr, (struct sockaddr *)&cli_addr,&clilen);
if ( gunionSckInstance < 0 )
{
UnionSystemErrLog("in UnionTcpipSvrTask:: accept()!\n");
//if (errno == 22) // 2006/10/27 增加
// break;
return(errCodeUseOSErrCode);
}
Linger.l_onoff = 1;
Linger.l_linger = 0;
if (setsockopt(gunionSckInstance,SOL_SOCKET,SO_LINGER,(char *)&Linger,sizeof(Linger)) != 0)
{
UnionSystemErrLog("in UnionTcpipSvrTask:: setsockopt linger!");
close(gunionSckInstance);
return(errCodeUseOSErrCode);
}
/*
收接发送数据
*/
}
客户端代码示例:
int UnionCreateSocketClient(char *ip,int port)
{
struct sockaddr_in psckadd;
int sckcli;
struct linger Linger;
int on=1;
if (ip == NULL)
{
UnionUserErrLog("in UnionCreateSocketClient:: NULL IPAddress!\n");
return(UnionErrNullIPAddressPassed);
}
if (port < 0)
{
UnionUserErrLog("in UnionCreateSocketClient:: Minus Socket Port [%d]!\n",port);
return(UnionErrMinusSocketPortPassed);
}
memset((char *)(&psckadd),'0',sizeof(struct sockaddr_in));
psckadd.sin_family = AF_INET;
psckadd.sin_addr.s_addr = inet_addr(ip);
psckadd.sin_port=htons((u_short)port);
if ((sckcli = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: socket! IP = [%s] port = [%d]\n",ip,port);
return(UnionErrCallingSocket);
}
if (setjmp(UnionCreateSckCliJmpEnv) != 0)
{
UnionUserErrLog("in UnionCreateSocketClient:: Timeout!\n");
alarm(0);
close(sckcli);
return(-1);
}
alarm(30);
signal(SIGALRM,UnionDealCreateSckCliTimeout);
if (connect(sckcli,(struct sockaddr *)(&psckadd),sizeof(struct sockaddr_in)) < 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: connect! IP = [%s] port = [%d]\n",ip,port);
//shutdown(sckcli,2);
close(sckcli);
alarm(0);
return(UnionErrCallingConnect);
}
Linger.l_onoff = 1;
Linger.l_linger = 0;
if (setsockopt(sckcli,SOL_SOCKET,SO_LINGER,(char *)&Linger,sizeof(Linger)) != 0)
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt linger!");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
if (setsockopt(sckcli, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt SO_OOBINLINE!\n");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
on = 1;
if (setsockopt(sckcli, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on)))
{
UnionSystemErrLog("in UnionCreatSocketClient:: setsockopt: TCP_NODELAY");
close(sckcli);
alarm(0);
return(UnionErrCallingSetsockopt);
}
alarm(0);
return(sckcli);
}
服务器套接字设置:
int UnionInitializeTCPIPServer(int port)
{
struct sockaddr_in serv_addr;
int scksvr;
int ret;
int reuse;
unsigned int clilen;
struct sockaddr_in cli_addr;
struct linger Linger;
int gunionSckInstance
// Initialize the socket
memset((char *)(&serv_addr), 0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons((u_short)port);
if ((scksvr = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: socket()!\n");
return(errCodeUseOSErrCode);
}
reuse = 1;
if ((ret = setsockopt(scksvr, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(int))) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: setsockopt()!\n");
UnionCloseSocket(scksvr);
return(errCodeUseOSErrCode);
}
if (bind(scksvr,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr_in)) < 0)
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: bind()!\n");
return(errCodeUseOSErrCode);
}
// Listen to new-coming connecting request
if ( listen(scksvr, 10000) < 0 )
{
UnionSystemErrLog("in UnionInitializeTCPIPServer:: listen()!\n");
return(errCodeUseOSErrCode);
}
clilen = sizeof(cli_addr);
gunionSckInstance = accept(scksvr, (struct sockaddr *)&cli_addr,&clilen);
if ( gunionSckInstance < 0 )
{
UnionSystemErrLog("in UnionTcpipSvrTask:: accept()!\n");
//if (errno == 22) // 2006/10/27 增加
// break;
return(errCodeUseOSErrCode);
}
Linger.l_onoff = 1;
Linger.l_linger = 0;
if (setsockopt(gunionSckInstance,SOL_SOCKET,SO_LINGER,(char *)&Linger,sizeof(Linger)) != 0)
{
UnionSystemErrLog("in UnionTcpipSvrTask:: setsockopt linger!");
close(gunionSckInstance);
return(errCodeUseOSErrCode);
}
/*
收接发送数据
*/
}