Delphi socket() 函数的应用
1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
PF_INET6(IPv6)等
2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
3、参数protocol指定需要使用的协议。虽然可以对同一个协议
家族(protocol family)(或者说通信域(domain))指定不同的协议
参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
两个参数使用默认的协议。
sa.sin_port:=htons(lisport);
sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY); //INADDR_ANY,表示本地计算机的默认IP地址
salen:=sizeof(sa);
//******************************************************************************
{ sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
s_addr按照网络字节顺序存储IP地址
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
}
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
closesocket(lissocket);
DebugMessage('无法打开端口:'+inttostr(lisport));
exit;
end;
{socket 套接字,网络编程必用的
listen ()监听从服务器传来的接收数据
listen ()创建一个套接口并监听申请的连接.}
//*******************************************
DebugMessage('连接成功!');
if acceptsocket=INVALID_SOCKET then
begin
DebugMessage('接受Socket失败!');
continue;
end;
Classes,messages,windows,winsock,stdctrls,Sysutils;
type
//线程的声明
TListenThread = class(TThread)
private
{ Private declarations }
lissocket:Tsocket;
lisport:integer;
str:string;
procedure AddMes;
procedure DebugMessage(mes:string);
protected
procedure Execute; override; //线程执行过程
public
constructor CreateIt(port:integer); //创建线程端口
destructor destroy;override; //结束线程
end;
uses main,UnitSocketRead,DataUnit ;
constructor TlistenThread.CreateIt(port:integer); //创建端口
begin
inherited create(true);
lisport:=port;
FreeOnTerminate:=true;
resume; //******唤醒线程 重(新)开(始),再继续;恢复;收回;【微软】继续执行 挂起的线程重新执行。
begin
if lissocket<>INVALID_SOCKET then
begin
//shutdown(lissocket,SD_BOTH);//中断连接,其实连接还存在。
closesocket(lissocket); //*********CloseSocket() 是用来关闭一个 Socket 的!
DebugMessage('Close Socket');
end;
inherited destroy;
end;
var acceptsocket:Tsocket;
sa:SOCKADDR_IN;
salen:integer;
tempthreadread:ThreadSocketRead;
begin
{ Place thread code here }
Lissocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
{socket()系统调用,带有三个参数:
1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
PF_INET6(IPv6)等
2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
3、参数protocol指定需要使用的协议。虽然可以对同一个协议
家族(protocol family)(或者说通信域(domain))指定不同的协议
参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
两个参数使用默认的协议。}
//******************************************************************************
begin
DebugMessage('Create Socket Error');
exit;
end;
sa.sin_port:=htons(lisport);
sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY); //INADDR_ANY,表示本地计算机的默认IP地址
salen:=sizeof(sa);
//******************************************************************************
{ sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
s_addr按照网络字节顺序存储IP地址
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
}
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
begin
closesocket(lissocket);
DebugMessage('无法打开端口:'+inttostr(lisport));
exit;
end;
{socket 套接字,网络编程必用的
listen ()监听从服务器传来的接收数据
listen ()创建一个套接口并监听申请的连接.}
//*******************************************
begin
acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。
DebugMessage('连接成功!');
if acceptsocket=INVALID_SOCKET then
begin
DebugMessage('接受Socket失败!');
continue;
end;
tempthreadread:=ThreadSocketRead.CreateIt(acceptsocket,Datamodule1.ADOConnection1.ConnectionString);
if tempthreadread<>nil then
begin
str:='New thread:'+IntToStr(tempthreadread.threadid);
synchronize(AddMes); //synchronize 时间同步 调用方法本模块的 AddMes方法
end
else
begin
closesocket(acceptsocket);
DebugMessage('创建执行线程失败!'); //调用本单元的 DebugMessage方法
end;
closesocket(lissocket); //一个关闭套接口的方法
end;
begin
if not terminated then //terminated 终结
FormMain.Memo.Lines.Add(FormatDatetime('hh:mm:ss',Now)+'-*-'+Str);
end;
begin
if gdebug then
begin
Str:=mes;
synchronize(AddMes); //synchronize 时间同步 调用方法本模块的 AddMes方法
end;
end;
//
Delphi socket() 函数的应用的更多相关文章
- 使用socket()函数创建套接字
在Linux中,一切都是文件,除了文本文件.源文件.二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件.例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout ...
- PHP Socket实现websocket(二)Socket函数
PHP socket函数是调用系统的的Socket函数,可以参考C语言的socket函数. Socket函数:http://php.net/manual/en/book.sockets.php 服务器 ...
- delphi公共函数 UMyPubFuncFroc--版权所有 (C) 2008 勇者工作室
{*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 勇 ...
- Windows套接字Socket函数
1.使用套接字函数之前,先要加载套接字函数库: #include "Winsock2.h" #pragma comment(lib,"Ws2_32.lib") ...
- (转载)delphi 常用函数(数学)
delphi 常用函数(数学) Delphi中怎么将实数取整? floor 和 ceil 是 math unit 里的函数,使用前要先 Uses Math.trunc 和 round 是 system ...
- socket函数
为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,famil ...
- Delphi回调函数及其使用
Delphi回调函数及其使用 1 回调函数的概述 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的 ...
- Delphi过程函数传递参数的八种方式
今天一同事问我为什么有些过程函数里面有Var而有些没有,不解,遂到网上百度,得解.快哉,快哉. 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传 ...
- delphi字符串函数大全
转帖:delphi字符串函数大全 2009-11-17 16:43:55 分类: delphi字符串函数大全 ━━━━━━━━━━━━━━━━━━━━━首部 function StringToGUID ...
随机推荐
- c#中string.trimstart() 和string.trimend() 的用法
trim(),trimstart(),trimend()这样写是去掉空格,trimstart(a)是去掉字符串开始包含char[] a的字符,trimend同trimstart. 例:char[] a ...
- 根据文件夹的GUid找到该文件夹
Guid guid = Guid.Parse(folderGuID); SPFolder folder = list.Folders[guid].Folder;
- Sql操作表字段
1.增加字段 alter table docdsp add dspcodechar(200)2.删除字段 ALTER TABLE table_NAME DROP COLUMNc ...
- wget 使用技巧
wget 是一个命令行的下载工具.对于我们这些 Linux 用户来说,几乎每天都在使用它.下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget. $ wget -r -n ...
- XML解析(转)
非原创,转载自http://my.oschina.net/khakiloveyty/blog/396671 xml解析主要可以使用CData,libxml2以及NSXMLParser,以下对各个方法给 ...
- jQuery 选择器【1】
jQuery 选择器 请使用我们的 jQuery 选择器检测器 来演示不同的选择器. 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname&q ...
- html》meta标签笔记
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- apache 网址重定向
参考了以下网站,终于基本搞定b2c网站伪静态.剩下的就是体力活了. 回家后整理下. http://yp.oss.org.cn/software/show_resource.php?resource_i ...
- Linux 多用户和多用户边界
1. 需求背景 2. 多用户的边界: 独立的工作目录 3. 多用户的边界:可操作/访问的资源 4. 多用户的边界: 可执行的操作 5. 多用户的特性标识: UID和GID -------------- ...
- 2016030102 - Ubuntu软件安装与删除相关命令
apt-get, dkpg 常用命令: 安装软件命令: apt-get install softname1 softname2 softname3…… 卸载软件命令: apt-get remove s ...