网络通讯程序中服务器端的程序,出现错误,不能绑定到端口,10048,哪位高人解释下。谢谢。。。

yinghuaqiri 2011-03-06 04:46:46
网络编程服务器端的程序,当运行到if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
时,出现错误,不能绑定到端口,10048,哪位高人解释下。谢谢。。。
.cpp文件
//---------------------------------------------------------------------------
//******************************CLASS TCommunication For TCP****************************************************
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
{
m_AcceptSocket=m_Socket;
szTmp[0]='\0';
FreeOnTerminate=true;
}
__fastcall TCommunication::~TCommunication()
{
// closesocket(m_AcceptSocket);
}
void __fastcall TCommunication::Execute()
{
char buf[4096];
int nSize=0;
nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
if(nSize>0)
{
buf[nSize]='\0';
//Display
//Form1->Memo1->Lines->Add("Received Length:"+String(nSize));
//Form1->Memo2->Lines->Add("Received:"+StrPas(buf));
Form1->Port->Lines->Add("Received:"+StrPas(buf));
Form1->Memo2->Lines->Add("Received Length:"+String(nSize));

//Deliver
::Sleep(100);

//**********************************************************************
//send(m_AcceptSocket,buf,nSize,0);
}

}
//******************************CLASS TListenThread*****************************************************
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
{
m_Socket=INVALID_SOCKET;
m_Port=m_PortA;
m_Protocol=m_ProtocolA;
szTmp[0]='\0';
::ZeroMemory(&wsaData,sizeof(WSAData));
::ZeroMemory(&server,sizeof(struct sockaddr_in));
FreeOnTerminate=TRUE;//Automatically delete while terminating.
}
__fastcall TListenThread::~TListenThread()
{
closesocket(m_Socket);
::WSACleanup();
m_Socket=INVALID_SOCKET;
m_Port=0;
m_Protocol=TCP;
szTmp[0]='\0';
::ZeroMemory(&wsaData,sizeof(WSAData));
::ZeroMemory(&server,sizeof(struct sockaddr_in));
}
void __fastcall TListenThread::DoError()
{
if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
WSACleanup();
return;
}
void __fastcall TListenThread::InitSocket()
{

WORD version=MAKEWORD(2,0);
if(::WSAStartup(version,&wsaData)){
sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
void __fastcall TListenThread::CreateListenSocket()
{
/*
switch(m_Protocol)
{
case UDP:
m_Socket=socket(AF_INET,SOCK_DGRAM,0);
break;
case TCP:
m_Socket=socket(AF_INET,SOCK_STREAM,0);

break;
default:
sprintf(szTmp,"Error protocol!");
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
break;
}
*/
m_Socket=socket(AF_INET,SOCK_STREAM,0);
if(m_Socket==INVALID_SOCKET){
sprintf(szTmp,"Failed to create socket!");
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
}
void __fastcall TListenThread::SetListenSocket()
{
server.sin_family=AF_INET;

server.sin_port=htons(m_Port);
server.sin_addr.S_un.S_addr=INADDR_ANY;
//server.sin_addr.S_un.S_addr=inet_addr("192.168.127.16");
int NewOpenType=SO_SYNCHRONOUS_NONALERT;
//////*************************下面的语句什么意思***************************
if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}

}
void __fastcall TListenThread::BindListenSocket()
{
if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}

}
void __fastcall TListenThread::ListenSocket()
{
if(listen(m_Socket,SOMAXCONN)){
sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
return;
}
//Determine whether there is any connection
FD_ZERO(&FDS);
FD_SET(m_Socket,&FDS);
}
void __fastcall TListenThread::Execute()
{
char buf[4096];
//struct sockaddr_in from; //for UDP
//int nLen=sizeof(from),nSize=0; //for UDP
InitSocket();
CreateListenSocket();
SetListenSocket();
BindListenSocket();

ListenSocket();
struct sockaddr_in client;
int nLength=sizeof(struct sockaddr_in);
while(!Terminated){
int nError=select(1,&FDS,0,0,0);
if(nError<=0) Terminate();
SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
if(m_AcceptSocket==INVALID_SOCKET){
sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
DoError();
Terminate();
return;
}
TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
//pCThread->Terminate();
//pCThread->WaitFor();
pCThread->Execute();
}
}


//下面两句是调用
pThread=new TListenThread(m_Protocol,m_Port,FALSE);
pThread->Execute();


.h文件


//---------------------------------------------------------------------------
class TCommunication:public TThread //Communication Thread
{
private:
SOCKET m_AcceptSocket;
char szTmp[256];//ERROR MESSAGE
public:
__fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
__fastcall ~TCommunication();

virtual void __fastcall Execute();
protected:
//virtual void __fastcall Execute();
};
//---------------------------------------------------------------------------
class TListenThread:public TThread //Listen Thread
{
private:
WSAData wsaData;
struct sockaddr_in server;
fd_set FDS;
UINT m_Port;
PROTO m_Protocol;
char szTmp[256];//Error Message
public:
SOCKET m_Socket;
void __fastcall DoError();
void __fastcall InitSocket();
void __fastcall CreateListenSocket();
void __fastcall SetListenSocket();
void __fastcall BindListenSocket();
void __fastcall ListenSocket();
void __fastcall Execute();

public:
__fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
virtual __fastcall ~TListenThread();
protected:
//virtual void __fastcall Execute();
};

enum PROTO {TCP,UDP};
...全文
694 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2011-03-18
  • 打赏
  • 举报
回复
if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
这句话确实不知道是干嘛的,恐怕不起作用,应该是写错的,INVALID_SOCKET应该是m_Socket,不然没什么意义嘛。
另外,你在bind之前,把端口设为REUSE比较好
我不懂电脑 2011-03-07
  • 打赏
  • 举报
回复
端口被占用了,换一个端口绑定,另外注意防火墙是不是不允许。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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