小弟有一程序需要连续分配大量的端口号,然后创建sokcet,绑定地址和这个端口号,端口号从1024以后的开始的,3000,5000,7000开始都尝试过,但都有绑定不成功的现象出现,但如何总有绑定失败的呢?
解决方案 »
- 大家看下我这个代码
- IE里Navigate函数的问题
- 大家帮我看看这段代码为什么会有GDI对象泄露!
- CDialogBar的通信问题
- 用到WTL做的一个像GOOGLE那样的工具条编译的时候老出错,望高手帮忙调试。。
- 请教SELECT嵌套select语句的问题
- 请教,我在将某个区域的图象保存到位图文件中后,我再将他加载到内存中,此时我在利用加载时得到的位图句柄作为参数以JPG格式再次保存,
- 怎样通过HICON句柄获得句柄所指图标的尺寸???有哪个函数可用?up有分。
- 添加新类的问题
- MFC中将一个文本文件的内容显示到编辑框内,再修改重新保存
- 创建一个ActiveX控件,在控件里怎么使用ADO或者别的来连接数据库,并对数据库进行操作。
- 《Windows程序设计》中关于映射模式的迷惑?
{
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;
}
{
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(厉兵秣马)说的吧, 哪个能用用哪个.
SendInfo sendInfo; for循环的一个周期后就应该失效了(进入thread之后状态不确定)
改为 SendInfo *sendInfo=(SendInfo *)malloc(sizeof(SendInfo);
然后在线程里使用完后后释放,free(sendInfo);
int err;
if ( bind(......) == SOCKET_ERROR )
{
err = WSAGetLastError(); //这里设断点,查看一下err值就知道了
。
。
。