int CnnctToServerIn(struct sockaddr_in tSvrAddr, int *piCilentFd)
{
int iFlag = 1;
int iRet;
int iFd = 0;
struct linger tSoLinger;
struct timeval tTimeVal;
iFd = socket(AF_INET, SOCK_STREAM, 0);
if (iFd <= 0) {
DPRINT(DEBUG, "GB:: socket fd = %d, err! reason:%s.", iFd, strerror(errno));
return FAILURE;
}
setsockopt(iFd, IPPROTO_TCP, TCP_NODELAY, (char *)&iFlag, sizeof(iFlag));
tTimeVal.tv_sec = 2;
tTimeVal.tv_usec = 0;
setsockopt(iFd, SOL_SOCKET, SO_SNDTIMEO, (char *)(&tTimeVal), sizeof(tTimeVal));
tTimeVal.tv_sec = 2;
tTimeVal.tv_usec = 0;
setsockopt(iFd, SOL_SOCKET, SO_RCVTIMEO, (char *)(&tTimeVal), sizeof(tTimeVal));
tSoLinger.l_onoff = 1;
tSoLinger.l_linger = 0;
setsockopt(iFd, SOL_SOCKET, SO_LINGER, (char *)(&tSoLinger), sizeof(tSoLinger));
iRet = connect(iFd, (struct sockaddr *)(&tSvrAddr), sizeof(tSvrAddr));
if (0 == iRet) {
*piCilentFd = iFd;
return SUCCESS;
}
else {
close(iFd);
printf("GB:: Connect to svr inet failed. Reason:%s.\n", strerror(errno));
return FAILURE;
}
}
这段代码是一个TCP客户端连接服务器的函数。下面是它的具体步骤:
创建一个套接字(socket),使用 socket(AF_INET, SOCK_STREAM, 0) 函数。
如果创建套接字失败,则返回错误代码 FAILURE。
设置套接字选项 TCP_NODELAY,通过调用 setsockopt(iFd, IPPROTO_TCP, TCP_NODELAY, (char *)&iFlag, sizeof(iFlag)) 来禁用 Nagle 算法,以提高数据传输的实时性。
设置发送超时时间和接收超时时间,通过调用 setsockopt(iFd, SOL_SOCKET, SO_SNDTIMEO, (char *)(&tTimeVal), sizeof(tTimeVal)) 和 setsockopt(iFd, SOL_SOCKET, SO_RCVTIMEO, (char *)(&tTimeVal), sizeof(tTimeVal)) 来设置超时时间为 2 秒。
设置 SO_LINGER 选项,通过调用 setsockopt(iFd, SOL_SOCKET, SO_LINGER, (char *)(&tSoLinger), sizeof(tSoLinger)) 来启用 SO_LINGER 选项,并设置延迟关闭时间为 0 秒。
使用 connect 函数 connect(iFd, (struct sockaddr *)(&tSvrAddr), sizeof(tSvrAddr)) 连接到指定的服务器地址。
如果连接成功(返回值为0),将套接字文件描述符保存在 piCilentFd 指针指向的变量中,并返回成功代码 SUCCESS。
如果连接失败,关闭套接字,并打印连接失败的原因,然后返回失败代码 FAILURE。
这段代码的作用是在指定的服务器地址上建立一个 TCP 连接,并将连接结果保存在 piCilentFd 指针指向的变量中。