- 论坛徽章:
- 0
|
- 这个程序里面用了2个套接字,一个本地套接字,一个监听外部连接时的套接字。
- 主要不清楚这个本地套接字有什么用,因为觉得哪个监听外部的完全都可以了,大家能解释解释本地套接字作用吗?谢谢了
- int main(int argc, char *argv[])
- {
- char szFile[256], szServicesName[64], szIP[32], szLine[257];
- long lPid, lPort, lRet;
- #ifdef IBM_AIX
- unsigned long iLen;
- #else
- int iLen;
- #endif
- int skMax, skNew, skLocal, skExtern, skServer;
- fd_set rset, setsave;
- struct _ALSend
- {
- long lPort;
- struct sockaddr_in saClient;
- }stSend;
- logv_SetFile(TCSERV_LOGFILE);
- /* 初始化*/
- if(tcomml_InitDaemon() != RC_SUCCESS)
- {
- Trace("初始化驻留进程失败!");
- fprintf(stdout, "启动tcserv失败!");
- exit(RC_FAILURE);
- }
- /* 得到本进程的监听端口*/
- lPort = tcomml_GetListenPort();
- if(0 >= lPort)
- {
- printf("tcserv:load listen port Error!\n"); fflush(stdout);
- exit(RC_FAILURE);
- }
- /* 获取交易信息配置*/
- lRet = tcomml_LoadTrConfig();
- if(lRet == RC_FAILURE)
- {
- printf("tcserv:load trConfig Error!\n"); fflush(stdout);
- exit(RC_FAILURE);
- }
- else
- g_lCurTrCount = lRet;
- FD_ZERO(&setsave);
- skExtern = socki_BindExtern(lPort, 5); /*******这个函数作用是用指定端口监听外部连接,后面贴有函数******/
- if(RC_FAILURE == skExtern)
- {
- Trace("绑定本地端口出错!");
- exit(RC_FAILURE);
- }
- skMax = skExtern;
- FD_SET(skExtern, &setsave);
- /* 产生一个本地监听用的套节子接口*/
- if((skLocal = socki_BindLocal()) == RC_FAILURE) /******这个是产生的本地套接字,是用SOCKET文件的形式。这个做什么用?后面贴有函数*****/
- {
- Trace("产生本地套节子失败");
- close(skExtern);
- exit(RC_FAILURE);
- }
- if(skLocal > skMax)
- skMax = skLocal;
- FD_SET(skLocal, &setsave);
- while(1)
- {
- rset = setsave;
- select(skMax + 1, &rset, NULL, NULL, NULL);
- if(FD_ISSET(skLocal, &rset)) [color=Red]/******主要是不清楚这个if分支的作用,因为感觉下面的if分支都完全可以处理****/[/color]
- {
- /* 一个本地的请求一定是监测进程*/
- Trace("收到本地的请求!");
- iLen = sizeof(stSend.saClient);
- memset(&stSend, 0, sizeof(struct _ALSend));
- lRet = recvfrom(skLocal, szLine, 256, 0,
- (struct sockaddr*)&stSend.saClient, &iLen);
- if(0 <= lRet)
- {
- Tstring(lRet, szLine);
- }
- continue;
- }
- if(FD_ISSET(skExtern, &rset))
- {
- iLen = sizeof(stSend.saClient);
- memset(&stSend, 0, sizeof(struct _ALSend));
- skNew = accept(skExtern, (struct sockaddr*)&stSend.saClient, &iLen);
- if(skNew < 0)
- {
- Trace("Accept Extern Error!");
- continue;
- }
- /* 将得到的IP地址转换为字符串*/
- memset(szIP, 0, sizeof(szIP));
- strcpy(szIP, (char*)inet_ntoa(stSend.saClient.sin_addr));
- Trace("收到来自地址%s的请求", szIP);
- memset(szServicesName, 0, sizeof(szServicesName));
- if(socki_Auth(skNew, szServicesName, szIP) == RC_FAILURE)
- {
- close(skNew);
- Trace("系统认证失败,非法授权用户连接!");
- continue;
- }
- Trace("通过认证");
- if(0 >= (lPid = tcomml_SelectServer(szServicesName))) /*这个函数作用是选择可用的服务进程*/
- {
- close(skNew);
- Trace("系统忙,无可用的服务进程!");
- continue;
- }
- /* 写出套节子,需要将端口号和客户端信息同时传递过去*/
- iLen = sizeof(stSend);
- stSend.lPort = lPort;
- Trace("连接进程(%d)", lPid);
- if((skServer = socki_ConnectLocal(lPid)) < 0) /*****用socket文件的形式,连接刚才的可用服务进程,后面贴有函数****/
- {
- Trace("连接进程(%d)出错", lPid);
- close(skNew);
- continue;
- }
- if(RC_SUCCESS != socki_Writefd(skServer, &stSend, iLen, skNew)) /****是向可用的服务进程发送数据*****/
- {
- Trace("通过(%d)发送套节子(%d)失败", skServer, skNew);
- }
- close(skNew);
- close(skServer);
- continue;
- }
- }
- }
复制代码
[ 本帖最后由 ablised 于 2009-4-5 01:24 编辑 ] |
|