请高人帮我看看,我在delphi中写这样的winsock程序能支持多用户连接吗?也就是多用户同时连接服务器。会不会出现,一个用户连接上时,别人用户就无法连接上服务器的情况。如果会,那我应该怎么解决呢?? 很急,分可以再加,真的,拜谢各位了 我听说,应该是accept后新建一个socket这样,就相当如一个web server,支持多用户同时连接了。
//2.初始化客户端结构
fillchar(server_addr, sizeof(server_addr), 0);
//2.1 端口
server_addr.sin_family := AF_INET;
server_addr.sin_port := htons(WarnListenPort); //WarnListenPort是int型的端口号
//2.2 主机IP
server_addr.sin_addr.S_addr := inet_addr(Pchar(WarnServerIP));
if server_addr.sin_addr.S_addr = INADDR_NONE then
begin
ShowMessage('初始化出错,绑定IP地址非法!');
exit;
end;
//3.创建SOCK
Warn_Sock_Accept := socket(AF_INET, SOCK_STREAM, 0);
if (Warn_Sock_Accept = SOCKET_ERROR) then
begin
ShowMessage('初始化出错,无法创建SOCK!');
exit;
end; //4.绑定
if (bind(Warn_Sock_Accept, server_addr, sizeof(server_addr)) <> 0) then
begin
showmessage('初始化出错,无法绑定!');
exit;
end;
//5.监听
if (listen(Warn_Sock_Accept, 5) <> 0) then
begin
showmessage('初始化出错,无法监听!');
exit;
end; while (true) do //死循环,不停的接收
begin
i := sizeof(client_addr);
fillchar(client_addr, i, 0);
ns := accept(Warn_Sock_Accept, addr(client_addr), addr(i));
if ns=-1 then
begin
// mainform.Memo1.Lines.Add('程序监听出现错误,请重起程序!');
application.Terminate;
exit;
end; fillchar(rbuf, sizeof(rbuf), #0);
recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ; //接收数据。
if recvlen>0 then
begin
mcumsg:=copy(rbuf,0,recvlen);
synchronize(parsemcumsg); //做相应的处理
end;
closesocket(ns);
end;
//2.初始化客户端结构
fillchar(server_addr, sizeof(server_addr), 0);
//2.1 端口
server_addr.sin_family := AF_INET;
server_addr.sin_port := htons(WarnListenPort); //WarnListenPort是int型的端口号
//2.2 主机IP
server_addr.sin_addr.S_addr := inet_addr(Pchar(WarnServerIP));
if server_addr.sin_addr.S_addr = INADDR_NONE then
begin
ShowMessage('初始化出错,绑定IP地址非法!');
exit;
end;
//3.创建SOCK
Warn_Sock_Accept := socket(AF_INET, SOCK_STREAM, 0);
if (Warn_Sock_Accept = SOCKET_ERROR) then
begin
ShowMessage('初始化出错,无法创建SOCK!');
exit;
end; //4.绑定
if (bind(Warn_Sock_Accept, server_addr, sizeof(server_addr)) <> 0) then
begin
showmessage('初始化出错,无法绑定!');
exit;
end;
//5.监听
if (listen(Warn_Sock_Accept, 5) <> 0) then
begin
showmessage('初始化出错,无法监听!');
exit;
end; while (true) do //死循环,不停的接收
begin
i := sizeof(client_addr);
fillchar(client_addr, i, 0);
ns := accept(Warn_Sock_Accept, addr(client_addr), addr(i));
if ns=-1 then
begin
// mainform.Memo1.Lines.Add('程序监听出现错误,请重起程序!');
application.Terminate;
exit;
end; fillchar(rbuf, sizeof(rbuf), #0);
recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ; //接收数据。
if recvlen>0 then
begin
mcumsg:=copy(rbuf,0,recvlen);
synchronize(parsemcumsg); //做相应的处理
end;
closesocket(ns);
end;
解决方案 »
- 使用SQL查询语句结果(变量)批量更新问题
- repeat 循环问题
- 关于LongWord(DWORD)分拆成16个Boolean.本人的疑问...
- 邪邪邪,如何在内存中操作数据库?
- 怎么实现DBEDIT上的DATETIMEPICKER获得日期的效果?
- Delphi 7从入门到精通 翻译的怎么样?
- 除了Delphi,我想再学一门语言,大家给我个意见,我真不知道学什么好呢!欢迎大家讨论哦
- Mediaplayer1的函数调用问题
- 调用dll中的窗体,把窗体关闭后,为什么调用dll的窗体也不能及时的显示
- 请问如何实现像这样的COMBOX
- 调查单位换算问题
- **** 谁有上传下载的源码或控件?能断点续传的最好 ****
while (true) do //死循环,不停的接收
begin
ns := accept(Warn_Sock_Accept, addr(client_addr), addr(i));//侦听线程会停在这儿侦听,来一个连接才会执行下去。
。
recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ; //它是在侦听线程同一线程,前面等待着的,它怎么可能运行到。
。
closesocket(ns);
end;--------------------------
accept后,为连接创建线程去传输数据,这是最基本做法。
要做到多用户连接就必须为每一个连接进来的用户还一个单独的线程,并且从新分配一个新的端口。
1 如果你一定要用api来写的话,就要用线程数组,去看看线程池的例子吧。
2 可以使用indy的控件,里面好像有个Tthreadpool控件的,很方便