level 9
附上源码:
[socket_def.inc]
const domain=AF_INET;
_type=SOCK_STREAM;
protocol=IPPROTO_TCP;
var sockfd:longint;
const backlog:longint=100;
const ports=9313;//服务器端口
portc=8795;//客户端端口
const ips=699574464;//服务器IP
ipc=749906112;//客户端IP
var addrs:TInetSockAddr=(family:domain;port:ports;addr:ips);
addrc:TInetSockAddr=(family:domain;port:portc;addr:ipc);
const addrlens:longint=sizeof(addrs);
addrlenc:longint=sizeof(addrc);
const flags=0;
var sockin,sockout:text;
var buff:string;
[socket_service.pas]
program socket_service;
uses sockets;
{$I socket_def.inc}
var addrlen:longint;
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrs,addrlens);
listen(sockfd,backlog);
accept(sockfd,addrc,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Service online. Please type in message.');
repeat
write('Service send: ');
readln(buff);
writeln(sockout,buff);
write('Client recv: ');
readln(sockin,buff);
writeln(buff);
until false;
close(sockout);
close(sockin);
end.
[socket_client.pas]
program so_cket_client;
uses sockets;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrc,addrlenc);
connect(sockfd,addrs,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Client online. Please wait for message.');
repeat
write('Service recv: ');
readln(sockin,buff);
writeln(buff);
write('Client send: ');
readln(buff);
writeln(sockout,buff);
until false;
close(sockout);
close(sockin);
end.
2014年02月12日 22点02分
2
level 9
加了个多线程,目前支持读取消息同时发送消息。
注意socketsh.inc里有个{$ifdef legacysocket}编译开关需要关掉,否则所有socket有关的函数都必须加fp,比如bind()要用fpbind()。
[socket_def.inc]
uses sockets,windows;
var tid:longword;
var sendthread,recvthread:boolean;
const domain=AF_INET;
_type=SOCK_STREAM;
protocol=IPPROTO_TCP;
var sockfd:longint;
const backlog:longint=100;
const ports=9313;//服务器端口
portc=8795;//客户端端口
const ips=749906112;//服务器IP
ipc=699574464;//客户端IP
var addrs:TInetSockAddr=(family:domain;port:ports;addr:ips);
addrc:TInetSockAddr=(family:domain;port:portc;addr:ipc);
const addrlens:longint=sizeof(addrs);
addrlenc:longint=sizeof(addrc);
const flags=0;
var sockin,sockout:text;
var buff:string;
procedure sendmessage;
begin
sendthread:=true;
readln(buff);
writeln(sockout,buff);
sendthread:=false;
end;
procedure recvmessage;
begin
recvthread:=true;
readln(sockin,buff);
writeln(buff);
recvthread:=false;
end;
[socket_service.pas]
program socket_service;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrs,addrlens);
listen(sockfd,backlog);
accept(sockfd,addrc,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Service online. Please type in message.');
repeat
if not sendthread then createthread(nil,0,@sendmessage,nil,0,tid);
if not recvthread then createthread(nil,0,@recvmessage,nil,0,tid);
sleep(1);
until buff='end';
close(sockout);
close(sockin);
end.
[socket_client.pas]
program so_cket_client;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
//bind(sockfd,addrc,addrlenc);
while not connect(sockfd,addrs,sockin,sockout) do ;
reset(sockin);
rewrite(sockout);
writeln('Client online. Please wait for message.');
repeat
if not sendthread then createthread(nil,0,@sendmessage,nil,0,tid);
if not recvthread then createthread(nil,0,@recvmessage,nil,0,tid);
sleep(1);
until buff='end';
close(sockout);
close(sockin);
end.
2014年02月13日 03点02分
5
服务器端IP和端口是必须要知道的,因为服务器端必须打开这个IP和端口监听信号,然后客户端连接上这个指定的IP和端口,而客户端的IP则不需要指定。
2014年02月13日 03点02分
@ax_pokl:"bind(sockfd,addrs,addrlens);"addrs类型不对是怎么回事(Lazarus)?
2015年06月13日 11点06分
level 14
斯锅咦~
虽然源代码一点都没看懂,但不明觉厉啊~
对了,能不能帮我写一个回帖的工具,就是那种抢楼活动时用的。
输入帖子的地址,自动回复100楼之类的,最好多几个选择。
谢谢。
2014年02月14日 05点02分
11
额,许多爆吧软件都支持的
2014年02月14日 06点02分
我只知道一种回复12楼的方法,超过12楼会被系统暂时屏蔽。
2014年02月16日 03点02分
回复 ax_pokl :我要啊。
2014年02月16日 03点02分
level 12
界面。。。用lazarus怎么样,delphi与fp不知是否通用
2014年02月14日 10点02分
16
必须通用的。
2014年02月14日 22点02分
回复 ax_pokl :有些库函数不一样
2014年02月15日 00点02分
回复 fp4869 :确实是,不过既然fp是开源的,把单元库源码直接复制过去不就能用了?
2014年02月16日 03点02分
level 12
解决了我长久以来的困扰!好顶赞,我的laz互联网计划可以正式开启啦!OwO
2014年02月18日 09点02分
19