我的计算机有多块网卡,用TServerSocket时,我想只与一个IP进行绑定,请问怎么设置。

我才是蝙蝠侠 2006-03-07 06:20:27
我的计算机有多块网卡,用TServerSocket时,我想只与一个IP进行绑定,请问怎么设置。
...全文
319 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2006-04-14
  • 打赏
  • 举报
回复
mark
Postgre.J 2006-04-13
  • 打赏
  • 举报
回复
mark
iec 2006-03-10
  • 打赏
  • 举报
回复
发表一下意见 我觉得以事件方式读取和发送数据是不是更合理一些。
if(WSAAsyncSelect(sockserver, Handle, WM_SOCK_USER ,FD_READ|FD_ACCEPT|FD_WRITE)!=0)
{
ShowMessage("");
}

void TForm1::OnRecv(TMessage &Message)
{

int nLen;
char RecvBuf[1000];
AnsiString rbuf;
struct sockaddr_in from;
int nLength=sizeof(struct sockaddr_in);
long lIPAddress = 0;
int tt= WSAGETSELECTEVENT(Message.WParam);
long bNodelay = 1;
int len = sizeof(sockaddr);
int nSendBuf=10;//设置为10
HANDLE hmd;
switch(WSAGETSELECTEVENT(Message.LParam))
{
case FD_READ:
nLen=recv(sockclient,RecvBuf,1000,0);
rbuf.sprintf("%s",RecvBuf);
Memo1->Lines->Add(rbuf.SubString(0,nLen));

break;
case FD_CLOSE:
ShowMessage("FD_CLOSE");
break;
case FD_CONNECT:
ShowMessage("FD_CONNECT");
break;
case FD_OOB:
ShowMessage("FD_OOB");
break;
case FD_ACCEPT:
sockclient=accept(sockserver,(sockaddr*)&sockaddrclient,&len);
setsockopt(sockserver,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

hIocp=CreateIoCompletionPort((HANDLE)sockclient,
hIocp,
(ULONG_PTR)0,
0);
Memo1->Lines->Add(WSAGetLastError());
setsockopt(
sockclient,
IPPROTO_TCP,
TCP_NODELAY,
(char *)&bNodelay,
sizeof(bNodelay)
);

break;

}
}
iec 2006-03-10
  • 打赏
  • 举报
回复
to netsys2(来电!)
可以不用线程 while()循环,接收发送数据。直接用FD_READ事件吧
yz20050510 2006-03-10
  • 打赏
  • 举报
回复
不错,好贴
netsys2 2006-03-09
  • 打赏
  • 举报
回复
// Unit3.cpp 通讯线程代码
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#pragma package(smart_init)
__fastcall Ttransmit::Ttransmit(bool CreateSuspended)
: TThread(CreateSuspended)
{
this->Suspend();
this->FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall Ttransmit::Init(SOCKET *socket,HANDLE hwnd,AnsiString CADD)
{
msock=*socket;
m_hwnd=hwnd;
ClientAddr=CADD;
this->Resume();
}
void __fastcall Ttransmit::Execute()
{
SendMessage(m_hwnd,WM_SOCKET,ACCEPTOK,long(ClientAddr.c_str()));
int cc=0;
while(!this->Terminated)
{
memset(xbbbuf,0x00,4096);
cc=recv(msock,xbbbuf,4096,0);
if(cc==SOCKET_ERROR || cc<=0)
{
//接收数据失败
memset(m_ErrMsg,0x00,50);
strcpy(m_ErrMsg,"断开连接");
SendMessage(m_hwnd,WM_SOCKET,RECVERR,(long)m_ErrMsg);
closesocket(msock);
this->Terminate();
}
//xbbbuf中是接收到的数据
//处理代码。。。。

//发送数据用以下代码
/*
long datalen;//数据长度
if(send(msock,xbbbuf,datalen,0)==SOCKET_ERROR)
{
memset(m_ErrMsg,0x00,50);
strcpy(m_ErrMsg,"发送通讯指令失败");
SendMessage(m_hwnd,WM_SOCKET,SENDERR,(long)m_ErrMsg);
closesocket(msock);
this->Terminate();
}
else
{
//发送成功
} */
}
}
//---------------------------------------------------------------------------


//Unit3.h
//---------------------------------------------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <winsock.h>

#define WSVERS MAKEWORD(1,0)
#define WM_SOCKET WM_USER + 1000
#define INITOK 1
#define INITERR 2
#define CREATEOK 3
#define CREATEERR 4
#define BINDOK 5
#define BINDERR 6
#define LISTENOK 7
#define LISTENERR 8
#define ACCEPTOK 9
#define ACCEPTERR 10
#define REMOTEQUEAST 11
#define SENDERR 12
#define RECVERR 13
#define WORKPOS 14
#define ACCEPTFINISH 15
#define THREADEND 16
#define FILESTART 17

//---------------------------------------------------------------------------
class Ttransmit : public TThread
{
private:
HANDLE m_hwnd;
AnsiString ClientAddr;
char xbbbuf[4096];
char m_ErrMsg[50]; //出错消息说明字符串指针
protected:
void __fastcall Execute();
public:
__fastcall Ttransmit(bool CreateSuspended);
void __fastcall Init(SOCKET *socket,HANDLE hwnd,AnsiString CADD);
SOCKET msock;
};
//---------------------------------------------------------------------------
#endif
netsys2 2006-03-09
  • 打赏
  • 举报
回复
//Unit2.cpp 监听线程代码
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit3.h"
#pragma package(smart_init)
Ttransmit *transmit;
__fastcall Tlisten::Tlisten(bool CreateSuspended)
: TThread(CreateSuspended)
{
this->Suspend();
this->FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall Tlisten::Init(HANDLE hwnd,long lport)
{
m_hwnd=hwnd;
m_port=lport;
this->Resume();
}
void __fastcall Tlisten::Execute()
{
AnsiString Cadd;
struct sockaddr_in fsin,sin;
SOCKET ssock;
struct hostent *hostname;
int alen;
WSADATA wsadata;
if(WSAStartup(WSVERS,&wsadata)!=0)
{
//启动WinSock失败
SendMessage(m_hwnd,WM_SOCKET,INITERR,0);
return;
}
//启动WinSock成功
SendMessage(m_hwnd,WM_SOCKET,INITOK,0);
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr("");
sin.sin_port=htons(m_port);
msock=socket(PF_INET,SOCK_STREAM,0);
if(msock==INVALID_SOCKET)
{
//创建Socket失败
SendMessage(m_hwnd,WM_SOCKET,CREATEERR,0);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,CREATEOK,0);
if(bind(msock,(struct sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{ // ------------在这里选择不同的网卡
//帮定Socket失败
SendMessage(m_hwnd,WM_SOCKET,BINDERR,0);
closesocket(msock);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,BINDOK,0);
if(listen(msock,5)==SOCKET_ERROR)
{
//监听失败
SendMessage(m_hwnd,WM_SOCKET,LISTENERR,0);
closesocket(msock);
WSACleanup();
return;
}
SendMessage(m_hwnd,WM_SOCKET,LISTENOK,0);
while(!this->Terminated)
{
alen=sizeof(struct sockaddr);
ssock=accept(msock, (struct sockaddr *)&fsin, &alen);
if(ssock==INVALID_SOCKET)
{
//接受请求失败
SendMessage(m_hwnd,WM_SOCKET,ACCEPTERR,0);
closesocket(msock);
WSACleanup();
this->Terminate();
return;
}
//接受请求成功。启动新线程接管
Cadd=AnsiString(inet_ntoa(fsin.sin_addr));
transmit=new Ttransmit(false); //启动新的线程接管accept到的socket
transmit->Init(&ssock,m_hwnd,Cadd);
}
}
//---------------------------------------------------------------------------


//Unit2.h
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <winsock.h>
#define WSVERS MAKEWORD(1,0)
//---------------------------------------------------------------------------
class Tlisten : public TThread
{
private:
HANDLE m_hwnd;
long m_port;
protected:
void __fastcall Execute();
public:
__fastcall Tlisten(bool CreateSuspended);
void __fastcall Init(HANDLE hwnd,long lport);
SOCKET msock;

};
//---------------------------------------------------------------------------
#endif
netsys2 2006-03-09
  • 打赏
  • 举报
回复
或者直接用SOCKET API吧。

主  题: 最近见问ServerSocket的哥们挺多的。我觉得ServerSocket不好。我一般用socket api写Server端。下面是一段示例代码。希望对正在写这方面的兄弟有用。
作  者: pp616 (傻小子)
等  级:
信 誉 值: 100
所属论坛: C++ Builder 网络编程/分布式开发
问题点数: 20
回复次数: 12
发表时间: 2003-03-31 13:51:33



//Unit1.cpp 窗体
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Tlisten *tlisten;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(tlisten==NULL)
{
tlisten =new Tlisten(false);
tlisten->Init(Handle,atol(edit->Text.c_str()));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(tlisten)
{
tlisten->Terminate();
tlisten=NULL;
}
}
//---------------------------------------------------------------------------
//你需要自己写一个消息map来响应WM_SOCKET消息
//消息里的参数意思在unit3.h中有定义


//Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *edit;
TButton *Button1;
TListBox *ListBox1;
TLabel *Label1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
我不懂电脑 2006-03-08
  • 打赏
  • 举报
回复
TServerSocket不可以,但是IdTCPServer可以。
僵哥 2006-03-07
  • 打赏
  • 举报
回复
建议使用Indy控件,支持绑定,关于TServerSocket可以参阅一下其Delphi版Source当中并未提供绑定接口,所以无法进行设置.
我才是蝙蝠侠 2006-03-07
  • 打赏
  • 举报
回复
自己顶一下,没人知道吗?

1,317

社区成员

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

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