端口绑定失败,急!!!

zhonglingqqxh 2005-03-25 10:19:51
小弟有一程序需要连续分配大量的端口号,然后创建sokcet,绑定地址和这个端口号,端口号从1024以后的开始的,3000,5000,7000开始都尝试过,但都有绑定不成功的现象出现,但如何总有绑定失败的呢?
...全文
1648 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cimagine 2005-06-08
  • 打赏
  • 举报
回复
用WSAGetLastError()函数,
int err;
if ( bind(......) == SOCKET_ERROR )
{
err = WSAGetLastError(); //这里设断点,查看一下err值就知道了


xtjqu 2005-06-07
  • 打赏
  • 举报
回复

SendInfo sendInfo; for循环的一个周期后就应该失效了(进入thread之后状态不确定)
改为 SendInfo *sendInfo=(SendInfo *)malloc(sizeof(SendInfo);
然后在线程里使用完后后释放,free(sendInfo);

comman_wang 2005-06-07
  • 打赏
  • 举报
回复
如果你要使用大量端口的话,尽量往后。
如:
10289-10989(未分配)
32250-32634(未分配)
48620-49150(未分配)
49151-65535(未分配)
realtom 2005-06-07
  • 打赏
  • 举报
回复
绑定失败后应该调用GetLasterror来看看失败的原因呀,有可能某些端口已经被占用了
Magnus 2005-03-29
  • 打赏
  • 举报
回复
作广告的,你的信誉值怎么这么低啊??
0011411 2005-03-29
  • 打赏
  • 举报
回复
daydaymissyou 2005-03-29
  • 打赏
  • 举报
回复
连续的大量端口?不太好.
嗯, 按Caps77(厉兵秣马)说的吧, 哪个能用用哪个.
chinawn 2005-03-29
  • 打赏
  • 举报
回复
做广告的又来了哦
zhonglingqqxh 2005-03-25
  • 打赏
  • 举报
回复
#define SEND_BASE_PORT 9000 //起始分配的端口号

for(int i = 0; i < m_FileInfo.iThreadCount; i++) //循环产生线程,每个线程都要socket绑定
{
SendInfo sendInfo;
sendInfo.iOder = i;
//sendInfo.strname = this->m_strFileName;
memcpy((void *)sendInfo.strname, (void *)(LPCTSTR)m_strFileName, m_strFileName.GetLength());
sendInfo.strname[m_strFileName.GetLength()] = '\0';

if(i == (m_FileInfo.iThreadCount - 1))
sendInfo.lSize = m_FileInfo.lSize - m_lSize * (m_FileInfo.iThreadCount - 1);
else
sendInfo.lSize = m_lSize;
sendInfo.sPort = SEND_BASE_PORT + i; // 每个线程中要绑定的端口号

Sleep(1000);
AfxBeginThread((AFX_THREADPROC)SendFileThread, (LPVOID)&sendInfo);//产生线程
}


UINT SendFileThread(LPVOID pParam)
{
SendInfo * sendInfo = (SendInfo *)pParam;

char * buffer = new char[DATA_BUF];
if(buffer == NULL)
return -1;

SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(sock == INVALID_SOCKET)
return -1;

SOCKADDR_IN saddr;
memset((void *)&saddr, 0, sizeof(SOCKADDR_IN));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = ADDR_ANY;
saddr.sin_port = htons(sendInfo->sPort);

int iResult = bind(sock, (sockaddr *)&saddr, sizeof(sockaddr)); //绑定
if(iResult == SOCKET_ERROR)
{
AfxMessageBox("bind() 失败!");

return -1;
}

iResult = listen(sock, 5);
if(iResult == SOCKET_ERROR)
{
AfxMessageBox("listen() 失败!");
//WSACleanup();

return -1;
}

SOCKET acceptSock;
SOCKADDR_IN socaddrin;
int nSize = sizeof(SOCKADDR_IN);
acceptSock = accept(sock, (sockaddr *)&socaddrin, &nSize);
if(acceptSock == INVALID_SOCKET)
return -1;

CFile file;
if(file.Open(sendInfo->strname, CFile::modeRead | CFile::shareDenyNone))
{
file.SeekToBegin();
file.Seek(CFile::begin, (sendInfo->iOder - 1)*sendInfo->lSize);
long lsize = sendInfo->lSize;
UINT uSize;
UINT uFinish = 0;
UINT uCurrent = DATA_BUF;

while(uFinish <= lsize)
{
uSize = file.Read((void *)buffer, uCurrent);
if(uSize <= 0)
return -1;

uFinish += uSize;
if((lsize - uFinish) < DATA_BUF)
uCurrent = lsize - uFinish;
//lsize -= uSize;

if(send(acceptSock, (char *)buffer, uSize, 0) <= 0)
return -1;
}
}
file.Close();

delete buffer;
buffer = NULL;

return 0;
}
zhonglingqqxh 2005-03-25
  • 打赏
  • 举报
回复
#define SEND_BASE_PORT 9000 //起始分配的端口号

for(int i = 0; i < m_FileInfo.iThreadCount; i++) //循环产生线程,每个线程都要socket绑定
{
SendInfo sendInfo;
sendInfo.iOder = i;
//sendInfo.strname = this->m_strFileName;
memcpy((void *)sendInfo.strname, (void *)(LPCTSTR)m_strFileName, m_strFileName.GetLength());
sendInfo.strname[m_strFileName.GetLength()] = '\0';

if(i == (m_FileInfo.iThreadCount - 1))
sendInfo.lSize = m_FileInfo.lSize - m_lSize * (m_FileInfo.iThreadCount - 1);
else
sendInfo.lSize = m_lSize;
sendInfo.sPort = SEND_BASE_PORT + i; // 每个线程中要绑定的端口号

Sleep(1000);
AfxBeginThread((AFX_THREADPROC)SendFileThread, (LPVOID)&sendInfo);//产生线程
}


UINT SendFileThread(LPVOID pParam)
{
SendInfo * sendInfo = (SendInfo *)pParam;

char * buffer = new char[DATA_BUF];
if(buffer == NULL)
return -1;

SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(sock == INVALID_SOCKET)
return -1;

SOCKADDR_IN saddr;
memset((void *)&saddr, 0, sizeof(SOCKADDR_IN));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = ADDR_ANY;
saddr.sin_port = htons(sendInfo->sPort);

int iResult = bind(sock, (sockaddr *)&saddr, sizeof(sockaddr)); //绑定
if(iResult == SOCKET_ERROR)
{
AfxMessageBox("bind() 失败!");

return -1;
}

iResult = listen(sock, 5);
if(iResult == SOCKET_ERROR)
{
AfxMessageBox("listen() 失败!");
//WSACleanup();

return -1;
}

SOCKET acceptSock;
SOCKADDR_IN socaddrin;
int nSize = sizeof(SOCKADDR_IN);
acceptSock = accept(sock, (sockaddr *)&socaddrin, &nSize);
if(acceptSock == INVALID_SOCKET)
return -1;

CFile file;
if(file.Open(sendInfo->strname, CFile::modeRead | CFile::shareDenyNone))
{
file.SeekToBegin();
file.Seek(CFile::begin, (sendInfo->iOder - 1)*sendInfo->lSize);
long lsize = sendInfo->lSize;
UINT uSize;
UINT uFinish = 0;
UINT uCurrent = DATA_BUF;

while(uFinish <= lsize)
{
uSize = file.Read((void *)buffer, uCurrent);
if(uSize <= 0)
return -1;

uFinish += uSize;
if((lsize - uFinish) < DATA_BUF)
uCurrent = lsize - uFinish;
//lsize -= uSize;

if(send(acceptSock, (char *)buffer, uSize, 0) <= 0)
return -1;
}
}
file.Close();

delete buffer;
buffer = NULL;

return 0;
}
Caps77 2005-03-25
  • 打赏
  • 举报
回复
绑定失败就继续绑定下一个端口,直到绑定成功

或者使用setsockopt设置端口重用
xjtuzhw 2005-03-25
  • 打赏
  • 举报
回复
你是在绑定端口还是让机器自己分配的呀
贴出来主要代码看一下
xuzheng318 2005-03-25
  • 打赏
  • 举报
回复
那是不是sokcet写的有问题!
zhonglingqqxh 2005-03-25
  • 打赏
  • 举报
回复
我检查过了,不存在端口冲突的现象啊

sdbtb 2005-03-25
  • 打赏
  • 举报
回复
端口冲突。

18,356

社区成员

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

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