关于delphi下socket编程(50分)

R

rong_zx

Unregistered / Unconfirmed
GUEST, unregistred user!
[red][/red][?]请教各位大侠:delphi开发socket程序,通过TServerSocket和TClientSocket控件实现,
怎么实现一对多的对话,且服务器根据客户端送来的信息给相应客户返回信息,
而不是给所有客户都发送信息?
 
c/s的每一个连接都是独立的线程,你对服务端的活动连接进行处理就没有问题的
 
昊海,真挚地谢谢你,你能讲具体点吗?我是一个初学者!比如说我现在想写一段一对二的代码,
该如何实现?谢谢!
 
TServerSocket和TClientSocket控件实现的是TCP,是点对点的,只能一对一。
如果要一对多可以用UDP,UDP支持广播或组播
 
对了,希望不要引起误解。应该说一个TCP连接只能实现一对一的通信,但是一个Server可以
同时和多个Client建立连接,不知道这是不是也算一对多。但毫无疑问,TCP只支持单播(unicast)
不支持broadcast和multicast。一个Client当然也可以同时和多个server连接,
但这也要建立多个连接如果在一个程序中实现,就要用多线程,如果要发送数据,就要给每
个连接都发送数据,而不是象广播那样发送一次就可以了。
 
你不用控件,直接用socket来编程,这样我觉得也很简单,并且程序也容易控制。
WSADATA wsaData;
int err=WSAStartup(MAKEWORD(2,0),&wsaData);
if (err!=0)
ShowMessage("不能初始化WinSock!");
SOCKET s_d;
struct sockaddr_in in_sd;
const sdPort=4000; //数据报端口
s_d=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP);

in_sd.sin_family=AF_INET;
in_sd.sin_addr.s_addr=in.s_addr;
in_sd.sin_port=htons(sdPort);

if(bind(s_d,(LPSOCKADDR)&in_sd,sizeof(in_sd)))
{
ShowMessage("套接字s_d绑定失败!");
return;
}


if(WSAAsyncSelect(r_d,Fsend->Handle,WM_Recv_rd,FD_READ|FD_WRITE) == SOCKET_ERROR)
ShowMessage("接收套接字1异步事件错误!");
头文件中定义:
#define WM_Recv_rd (WM_USER+1)
类定义中:
void __fastcall Receive_rd(TMessage Message);
BEGIN_MESSAGE_MAP //自定义消息映射
MESSAGE_HANDLER(WM_Recv_rd, TMessage, Receive_rd)
END_MESSAGE_MAP(TForm)
//---------------------------------------------------------------------------
void __fastcall TFsend::Receive_rd(TMessage Message)
{if(Message.LParam==FD_READ)
{TListItem *ListItem;
char buf[1000]={0};
sockaddr_in in_r;
int len=sizeof(in_r);
recvfrom(r_d,(char *)&buf,1000,0,(sockaddr*)&in_r,&len);
处理过程。。。
}
}
这是在c++builder中我做过的程序,以前用delphi也做过,很容易改成delphi的。
 
谢谢,我想问如何实现一个服务器和多个客户通信时,服务器端如何单独给 某个特定客户
发送信息而不是通过广播方式发送给所有客户?
 
>>实现一对多的对话,且服务器根据客户端送来的信息给相应客户返回信息
你对不同的连接(由目的地址标识)发不同的内容就可以了。
 
recvfrom(r_d,(char *)&buf,1000,0,(sockaddr*)&in_r,&len);
上面的程序接受到数据后
sendto(in_r,,);
 
再具体一点,TServerSocket控件只提供了TServerSocket.Socket.Connections.SendText()
方式发送信息,但是我不知道这个i如何确定!!
 
顶部