socket和多线程的问题,高手请进(多多分等你拿:D) 还有个问题,怎么没写上?1>如何编写多线呈的serversocket,细节是什么?或在何处可以找到? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每个TClientSocket和TServerSocket建立一次连接时,就获得一对唯一的IP和Port,remoteAddress和remoteport指的就是这里的IP和Port了。通过这一对数据信息,可以判断和区分各个连接。要保证不丢包,需要对每个数据包进行报文格式定义,当包尚未接收全时,要继续接收,直到收到报文的终止标志为止。 如果一个ip上连上来好几个client,那么她们所有的remoteaddress,remoteport都一样,区分不开,我发现remoteaddr.sin_port加上remoteaddress就可以,但我不太明白. 为什么没人回答,是不相信分吗,君子一言驷马难追,回答出一道50分,不会大家对此问题不屑一顾吧,如果你想编写一个socket的server,这些问题都是要解决的. 既然如此,请用Api来实现好一些. 1>多线程SOCK最好用阻塞模式,在ACCEPT后开一新线程,while(!terminated){ read(sock); write(sock);}2>最大连接数有系统决定,它应在IP协议栈中定义(我没有试过),估计在128或256等数中一个完整的TCP连接包括(本地IP,本地port,远程IP,远程port),而且不可能有二个连接具有相同的四元组。3>不可能,因为四元组唯一地定义了每一个连接,两个客户一定是不同的四元组丢包的情况:TCP是不会丢包的。UDP可能丢包,但一般在局网中也不会丢包,除非你不去读SOCKET4>ICS,INDY,去www.torry.ru肯定能找到5>绝对有这种可能 用CSocket也可以,它本身就是阻塞的(其实看看它的定义就知道了其原理)最重要的是定义的数据结构,还有自定的缓冲区,还有一些情况是要同步的,请注意 1、4的答案和sundayhews一样2:sin_port是标准socket结构里的定义。一般你没必要去使用。3:这个是重点。我曾经作过测试,不同的客户连接在OnClientRead里是不会串的(有事件就一定是非线程方式),实际上OnClientRead的SOCKET参数对不同的客户是不同的。但是同一个客户的READ、OPEN、CLOSE事件则有可能会串,我让客户机不断去连接、断开服务器,一连通就马上发数据,这样用不了几次就会出错。所以这种方式有很大的漏洞,还是block的好。5:你肯定要加同步处理。当然不一定要用临界区,这要看你怎么用了。有很多方法的。 socket编程,ClientSocket与ServerSocket之间要自行定义一个通讯协议,也就是一个通讯命令很重要,格式举例如下:引导串,命令长度,命令串,参数个数,参数等互相之间按此格式交换数据, 你要自行编程分析这些命令;我正在研究这个问题,解决后再发贴子,我喜欢异步方式通讯,但有一些问题要解决; to BCB 自行定义和分析协议是非常简单的另外,的确可能在一次read里收到几个完整的包,这里要稍加处理。我还没有碰到收包不完整的情况,在JAVA里碰到过。不知道大家有什么看法。我觉得这个保证机制应该是由TCP层提供的,否则,那可是个很麻烦的事情。 回答第二个问题:区分连接是用sockethandle,即serversocket.socket.connections[i].sockethandle.用ip地址是不对的。第三个问题:用区分连接的方法来区分每个客户发来的包。包当然有可能丢失,那是由于网络的问题,最好先测试一下网络。 多线程Socket通讯是采用阻塞的办法,一个线程在通讯的时侯, 其它线程能同时通讯吗?如果一个线程通讯过程中出现故障,其它线程会不会受到影响? 从前4个问题看出你对socket的了解很粗浅, 关于一个套接字的5大组成部分并没有理解.建议你先读一读关于TCP/IP的基础书籍.至于同步, 是必须的, 你采测试的时候设置断点是会自动同步各线程的, 不信你不要调试,运行看看, 很有可能出错. 看了以上回答,觉得还是有些问题1》SOCKETHANDLE是能区分永久连接中的客户端,但是不能区分非永久连接中的客户端举个例子,第一个客户连上来他的SOCKETHANDLE是40,尔后断开,第二个客户端连上来,注意,他的SOCKETHANDLE也是40,这肯定区分不了这两个客户。DELPHI的SOCKETHANDLE有个规律:40,48,54,58,................2》一个线程不停的从TStringlist.item[0]读,一个线程不停的调用TStringList.ADD(S)我做过测试,没问题,不需要同步,因为一个从头读,一个在尾上加,为什么同步是必需的,不要想当然,看来你对同步了解也很粗浅3》那个四元组无法区分,不要讲什么tcp/ip,网络原理我早就考完了,注意一下实际问题,和书本并不完全一样,我做过测试,Remoteaddress与RemoteAddr.sin_port能区分非永久连接的客户端,有人能解释sin_port什么含义,为什么每次连接都不同吗? to CKEN(2000-12-21 17:16:00) 1.非永久性的连接,你只能根据他的地址来区分。你可以在连接后立刻取得他的地址。连接时回自动启动一个SOCKET,他的HANDLE是个THANDLE类型,THANDLE等价于INTEGER,4字节长。断开时该SOCKET回自动释放,因此回出现你提到的情况。23。sin_port是端口,端口和IP地址一起组成唯一协议地址。 fastreport控件加立象打印机问题,错位。 delphi7 通过bde怎么连接db2 各位老大,那位能找到Office 95的安装盘下载,20分奉上。帮帮忙吧! Adoquery1.sql.text一行写不下了,第二行怎么连接? 打包后程序不能使用? 怎么用程序写清除Web站点记录? delphi高手拉 我 一把 请大家帮忙找一下Windows Xp 专业版的序列号 如何调用winapi函数 请问如何做安装盘2.急!!! 寻师问药! BCB请进来拿分数(闲人勿入)
区分不开,我发现remoteaddr.sin_port加上remoteaddress就可以,但我不太明白.
对此问题不屑一顾吧,如果你想编写一个socket的server,这些问题都是要解决
的.
while(!terminated){
read(sock);
write(sock);
}
2>最大连接数有系统决定,它应在IP协议栈中定义(我没有试过),估计在128或256等数中
一个完整的TCP连接包括(本地IP,本地port,远程IP,远程port),而且不可能有二个连接具有相同的四元组。
3>不可能,因为四元组唯一地定义了每一个连接,两个客户一定是不同的四元组
丢包的情况:
TCP是不会丢包的。
UDP可能丢包,但一般在局网中也不会丢包,除非你不去读SOCKET
4>ICS,INDY,去www.torry.ru肯定能找到
5>绝对有这种可能
最重要的是定义的数据结构,还有自定的缓冲区,还有一些情况是要同步的,请注意
2:sin_port是标准socket结构里的定义。一般你没必要去使用。
3:这个是重点。我曾经作过测试,不同的客户连接在OnClientRead里是不会串的(有事件就一定是非线程方式),实际上OnClientRead的SOCKET参数对不同的客户是不同的。但是同一个客户的READ、OPEN、CLOSE事件则有可能会串,我让客户机不断去连接、断开服务器,一连通就马上发数据,这样用不了几次就会出错。所以这种方式有很大的漏洞,还是block的好。
5:你肯定要加同步处理。当然不一定要用临界区,这要看你怎么用了。有很多方法的。
之间要自行定义一个通讯协议,也就是一个通
讯命令很重要,格式举例如下:
引导串,命令长度,命令串,参数个数,参数等互相之间按此格式交换数据, 你要自行编程分
析这些命令;
我正在研究这个问题,解决后再发贴子,我喜欢
异步方式通讯,但有一些问题要解决;
自行定义和分析协议是非常简单的另外,的确可能在一次read里收到几个完整的包,这里要稍加处理。我还没有碰到收包不完整的情况,在JAVA里碰到过。不知道大家有什么看法。我觉得这个保证机制应该是由TCP层提供的,否则,那可是个很麻烦的事情。
第三个问题:用区分连接的方法来区分每个客户发来的包。包当然有可能丢失,那是由于网络的问题,最好先测试一下网络。
一个线程在通讯的时侯, 其它线程
能同时通讯吗?如果一个线程通讯过程中
出现故障,其它线程会不会受到影响?
建议你先读一读关于TCP/IP的基础书籍.
至于同步, 是必须的, 你采测试的时候设置断点是会自动同步各线程的, 不信你不要调试,
运行看看, 很有可能出错.
1》SOCKETHANDLE是能区分永久连接中的客户端,但是不能区分非永久连接中的客户端
举个例子,第一个客户连上来他的SOCKETHANDLE是40,尔后断开,第二个客户端连上来,
注意,他的SOCKETHANDLE也是40,这肯定区分不了这两个客户。DELPHI的SOCKETHANDLE
有个规律:40,48,54,58,................
2》一个线程不停的从TStringlist.item[0]读,一个线程不停的调用TStringList.ADD(S)
我做过测试,没问题,不需要同步,因为一个从头读,一个在尾上加,为什么同步是必需的,不要
想当然,看来你对同步了解也很粗浅
3》那个四元组无法区分,不要讲什么tcp/ip,网络原理我早就考完了,注意一下实际问题,和书本并不完全一样,我做过测试,Remoteaddress与RemoteAddr.sin_port能区分非永久连接的客户端,有人能解释sin_port什么含义,为什么每次连接都不同吗?
2
3。sin_port是端口,端口和IP地址一起组成唯一协议地址。