一个PORT能不能几个程序同时用?
本人做了一个服务器程序,客户现在因为用户过大,但是买的产品中,已经烧录了服务器名字,和端口号,
现在想开几个服务程序,但是只能用一个IP和端口。
现在就有问题了,就是同一台机器中一个端口在能不能同时几个程序用.
int CAppServer::StartListeningTask(void *lpVoid)
{
int iRet, addrLen;
sockaddr_in addr, addrAccept;
SOCKET sckAccept;
static char pszMsg[256];
int nErrCount,timeout=5000;
hostent * pEnt;
WORKPARAM * pListenWorkParam;
WORKPARAM *pGlobListparaem=(WORKPARAM *)lpVoid;
OUTPUT("going to create socket.\r\n");
sckListen = socket(AF_INET, SOCK_STREAM, 0);
if(sckListen==INVALID_SOCKET)
{
sprintf(pszMsg, "INVALID_SOCKET, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
OUTPUT(pszMsg);
return 0;
}
OUTPUT("Listening socket created successfully.\r\n");
iRet = gethostname(pszMsg, 256);
if(iRet)
{
sprintf(pszMsg, "Error occur when gethostname(), WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
OUTPUT(pszMsg);
return 0;
}
pEnt =gethostbyname(pszMsg);
if(!pEnt)
{
sprintf(pszMsg, "Error occur when gethostbyname(), WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
OUTPUT(pszMsg);
return 0;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(globalInfo.nPort);
addr.sin_addr.S_un.S_un_b.s_b1 = pEnt->h_addr_list[0][0];
addr.sin_addr.S_un.S_un_b.s_b2 = pEnt->h_addr_list[0][1];
addr.sin_addr.S_un.S_un_b.s_b3 = pEnt->h_addr_list[0][2];
addr.sin_addr.S_un.S_un_b.s_b4 = pEnt->h_addr_list[0][3];
globalInfo._b1 = pEnt->h_addr_list[0][0];
globalInfo._b2 = pEnt->h_addr_list[0][1];
globalInfo._b3 = pEnt->h_addr_list[0][2];
globalInfo._b4 = pEnt->h_addr_list[0][3];
iRet = bind(sckListen, (const sockaddr*)&addr, sizeof(addr));
if(iRet==SOCKET_ERROR)
{
sprintf(pszMsg, "SOCKET_ERROR, WSAGetLastError()=%d", WSAGetLastError());
OUTPUT(pszMsg);
return 0;
}
nErrCount = 0;
OUTPUT("Listening...\r\n");
iRet = listen(sckListen, SOMAXCONN);
if(iRet==SOCKET_ERROR)
{
sprintf(pszMsg, "INVALID_SOCKET, WSAGetLastError()=%d", WSAGetLastError());
OUTPUT(pszMsg);
nErrCount++;
if(nErrCount>=10)
{
sprintf(pszMsg, "nErrCount>=10, listening thread terminated.\r\n");
return 0;
}
}
nErrCount = 0;
exit_acceptthread_flag=0;
exit_ListeningThread_flag=0;
while(!exit_ListeningThread_flag)
{
addrLen = sizeof(addrAccept);
sckAccept = accept(sckListen, (struct sockaddr*)&addrAccept, &addrLen);
if(sckAccept==INVALID_SOCKET)
{
sprintf(pszMsg, "accept()=SOCKET_ERROR, WSAGetLastError()=%d", WSAGetLastError());
OUTPUT(pszMsg);
return 0;
}
OUTPUT("One %d client accepted successfully.\r\n",g_nConnectionCount);
// GetDlgItem(IDC_OUTPUT)->SetWindowText("One client accepted successfully.\r\n!");
if(::setsockopt(sckAccept,SOL_SOCKET,SO_KEEPALIVE ,(char *)&timeout,sizeof(timeout))==SOCKET_ERROR)
{
return 0;
}
pListenWorkParam = new WORKPARAM;
pListenWorkParam->sckClient = sckAccept;
pListenWorkParam->addr = addrAccept;
pListenWorkParam->CAppserver=(void*)pGlobListparaem->CAppserver;
pListenWorkParam->Is_Authored=0;
AfxBeginThread(WorkingThread, (LPVOID)pListenWorkParam, THREAD_PRIORITY_BELOW_NORMAL);
}
sckListen=-1;
return 0;
}
这是我的Listening线程.能不能Listen多次啊,我个人觉的不行,有什么办法?