一个PORT能不能几个程序同时用?

kiddy1010 2008-10-30 04:02:23
本人做了一个服务器程序,客户现在因为用户过大,但是买的产品中,已经烧录了服务器名字,和端口号,
现在想开几个服务程序,但是只能用一个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多次啊,我个人觉的不行,有什么办法?
...全文
78 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiddy1010 2008-11-03
  • 打赏
  • 举报
回复
明白了,谢谢各位了。.
WinEggDrop 2008-10-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 kiddy1010 的帖子:]
本人做了一个服务器程序,客户现在因为用户过大,但是买的产品中,已经烧录了服务器名字,和端口号,
现在想开几个服务程序,但是只能用一个IP和端口。
现在就有问题了,就是同一台机器中一个端口在能不能同时几个程序用.
int CAppServer::StartListeningTask(void *lpVoid)
{
int iRet, addrLen;
sockaddr_in addr, addrAccept;
SOCKET sckAccept;
static char pszMsg[256];
int nErrCount,timeout=5000;…
[/Quote]

可以重用,但用户层下,只有一个可以接收到数据.例如程序1帮在端口12345,程序2设置端口重用,也成功绑在端口12345,那么程序2能接收到连接和数据.在内核层(驱动),可以利用数据过滤钩子在各不影响的情况下实现端口共用.
Wenxy1 2008-10-30
  • 打赏
  • 举报
回复
socket中端口重用
2008年06月13日 星期五 下午 04:46
下面方法实现多个程序对一个端口的重用。

int sockfd;

int opt = 1;

int len = sizeof(opt);

sockfd = socket(AF_INET,SOCK_STREAM,0);

setsockopt(sockfd,SQL_SOCKET,SO_REUSEADDR,&opt,&len);

其中setsokopt函数用法如下:

int setsockopt(int s, int level, int optname, const void *optval,
socklen_t optlen);

s: 套接字,指向一个打开的套接口描述字
level: 级别,指定选项代码的类型。具体类型如下:
SOL_SOCKET: 基本套接口
IPPROTO_IP: IPv4套接口
IPPROTO_IPV6: IPv6套接口
IPPROTO_TCP: TCP套接口
optname: 选项名,选项名称
optval: 选项值,是一个指向变量的指针类型
optlen : 选项长度,即 optval 的大小
返回值: 如果函数执行成功,返回0;如果函数执行失败,返回-1。


我也没做过,所以帮你google到的资料
skyful123 2008-10-30
  • 打赏
  • 举报
回复
设置第三个参数为SO_REUSEADDR
skyful123 2008-10-30
  • 打赏
  • 举报
回复
setsockopt()使用这个方法可以达到你需要的效果
kiddy1010 2008-10-30
  • 打赏
  • 举报
回复
楼上说具体点好吗
Wenxy1 2008-10-30
  • 打赏
  • 举报
回复
port可以重用。
kiddy1010 2008-10-30
  • 打赏
  • 举报
回复
没有别的办法吗?
这些我也清楚,实在没有也就算了
因为客户过两天带个印度老来,说是网络专家,
要讨论这个问题,
为了不想给中国人丢人,特意确认下,
Javesun 2008-10-30
  • 打赏
  • 举报
回复
如果一个端口在使用中,再启用另一个占用该端口的服务,会报错误。
Javesun 2008-10-30
  • 打赏
  • 举报
回复
这个是不行的。
路人乙2019 2008-10-30
  • 打赏
  • 举报
回复
不行的。一个IP还差不多。
dic_walter 2008-10-30
  • 打赏
  • 举报
回复
不行!
一个端口只能用作一个服务

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧