SOCKET流式套接字选项设置

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);
}


/*
收接发送数据
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值