socket和多线程的问题,高手请进(多多分等你拿:D)

时间:2022-09-24 14:32:45
2》Tserversocket在noblocking的模式下,可以接受多少个连接(可能来自同一个 
ip),如何唯一区分一个连接,是不是Tserversoket.socket.connection[i].remoteaddress加上Tserversoket.socket.connection[i].remoteaddr.sin_port?这是什么含义?
3》假如许多客户端同时不停的向TServersocket发包,我测试过很可能在
TServersocket.OnclientRead事件socket.RecieveText中包含一个客户端发来的几个包,问题是在这个事件中可不可能在socket.RecieveText中包含不同客户的包(我觉得不可能),可不可能出现丢包?原因是什么?
4》D5的TServerSocket实在太烂,有没更好的,要好用啊?
5》假如一个多线程的程序,主线程不停的向次线程的TList公有变量加入对象,而这个线程不停的从item[0]读,需要临界区同步吗?不要临界区可能会有问题吗?(我没测试出来
过)
hehe,问题多多,分数自然也不少了。

19 个解决方案

#1


还有个问题,怎么没写上?
1>如何编写多线呈的serversocket,细节是什么?或在何处可以找到?

#2


3.在局网上可能不会,但速度慢或包堵塞时,就会所以结构要定义好,
比如###,$$$的开头结尾,包长度等等

#3


4.用API写Socket就最好

#4


用###,$$$开头结尾不太好,我看还是用控制字符开头结尾吧比如#13 ,#9等等

#5


    每个TClientSocket和TServerSocket建立一次连接时,就获得一对唯一的IP和Port,remoteAddress和remoteport指的就是这里的IP和Port了。通过这一对数据信息,可以判断和区分各个连接。要保证不丢包,需要对每个数据包进行报文格式定义,当包尚未接收全时,要继续接收,直到收到报文的终止标志为止。

#6


如果一个ip上连上来好几个client,那么她们所有的remoteaddress,remoteport都一样,
区分不开,我发现remoteaddr.sin_port加上remoteaddress就可以,但我不太明白.

#7


用###,$$$开头结尾,用控制字符#13 ,#9分割结构

#8


为什么没人回答,是不相信分吗,君子一言驷马难追,回答出一道50分,不会大家
对此问题不屑一顾吧,如果你想编写一个socket的server,这些问题都是要解决
的.

#9


既然如此,请用Api来实现好一些.

#10


1>多线程SOCK最好用阻塞模式,在ACCEPT后开一新线程,
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>绝对有这种可能

#11


用CSocket也可以,它本身就是阻塞的(其实看看它的定义就知道了其原理)
最重要的是定义的数据结构,还有自定的缓冲区,还有一些情况是要同步的,请注意

#12


1、4的答案和sundayhews一样
2:sin_port是标准socket结构里的定义。一般你没必要去使用。
3:这个是重点。我曾经作过测试,不同的客户连接在OnClientRead里是不会串的(有事件就一定是非线程方式),实际上OnClientRead的SOCKET参数对不同的客户是不同的。但是同一个客户的READ、OPEN、CLOSE事件则有可能会串,我让客户机不断去连接、断开服务器,一连通就马上发数据,这样用不了几次就会出错。所以这种方式有很大的漏洞,还是block的好。
5:你肯定要加同步处理。当然不一定要用临界区,这要看你怎么用了。有很多方法的。

#13


socket编程,ClientSocket与ServerSocket
之间要自行定义一个通讯协议,也就是一个通
讯命令很重要,格式举例如下:
引导串,命令长度,命令串,参数个数,参数等

互相之间按此格式交换数据, 你要自行编程分
析这些命令;
我正在研究这个问题,解决后再发贴子,我喜欢
异步方式通讯,但有一些问题要解决;










#14


to BCB
  自行定义和分析协议是非常简单的

另外,的确可能在一次read里收到几个完整的包,这里要稍加处理。我还没有碰到收包不完整的情况,在JAVA里碰到过。不知道大家有什么看法。我觉得这个保证机制应该是由TCP层提供的,否则,那可是个很麻烦的事情。

#15


回答第二个问题:区分连接是用sockethandle,即serversocket.socket.connections[i].sockethandle.用ip地址是不对的。
第三个问题:用区分连接的方法来区分每个客户发来的包。包当然有可能丢失,那是由于网络的问题,最好先测试一下网络。

#16


多线程Socket通讯是采用阻塞的办法,
一个线程在通讯的时侯, 其它线程
能同时通讯吗?如果一个线程通讯过程中
出现故障,其它线程会不会受到影响?


   





#17


从前4个问题看出你对socket的了解很粗浅, 关于一个套接字的5大组成部分并没有理解.
建议你先读一读关于TCP/IP的基础书籍.
至于同步, 是必须的, 你采测试的时候设置断点是会自动同步各线程的, 不信你不要调试,
运行看看, 很有可能出错.

#18


看了以上回答,觉得还是有些问题
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什么含义,为什么每次连接都不同吗?

#19


to CKEN(2000-12-21 17:16:00) 

1.非永久性的连接,你只能根据他的地址来区分。你可以在连接后立刻取得他的地址。连接时回自动启动一个SOCKET,他的HANDLE是个THANDLE类型,THANDLE等价于INTEGER,4字节长。断开时该SOCKET回自动释放,因此回出现你提到的情况。
2。。。。。。
3。sin_port是端口,端口和IP地址一起组成唯一协议地址。

#1


还有个问题,怎么没写上?
1>如何编写多线呈的serversocket,细节是什么?或在何处可以找到?

#2


3.在局网上可能不会,但速度慢或包堵塞时,就会所以结构要定义好,
比如###,$$$的开头结尾,包长度等等

#3


4.用API写Socket就最好

#4


用###,$$$开头结尾不太好,我看还是用控制字符开头结尾吧比如#13 ,#9等等

#5


    每个TClientSocket和TServerSocket建立一次连接时,就获得一对唯一的IP和Port,remoteAddress和remoteport指的就是这里的IP和Port了。通过这一对数据信息,可以判断和区分各个连接。要保证不丢包,需要对每个数据包进行报文格式定义,当包尚未接收全时,要继续接收,直到收到报文的终止标志为止。

#6


如果一个ip上连上来好几个client,那么她们所有的remoteaddress,remoteport都一样,
区分不开,我发现remoteaddr.sin_port加上remoteaddress就可以,但我不太明白.

#7


用###,$$$开头结尾,用控制字符#13 ,#9分割结构

#8


为什么没人回答,是不相信分吗,君子一言驷马难追,回答出一道50分,不会大家
对此问题不屑一顾吧,如果你想编写一个socket的server,这些问题都是要解决
的.

#9


既然如此,请用Api来实现好一些.

#10


1>多线程SOCK最好用阻塞模式,在ACCEPT后开一新线程,
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>绝对有这种可能

#11


用CSocket也可以,它本身就是阻塞的(其实看看它的定义就知道了其原理)
最重要的是定义的数据结构,还有自定的缓冲区,还有一些情况是要同步的,请注意

#12


1、4的答案和sundayhews一样
2:sin_port是标准socket结构里的定义。一般你没必要去使用。
3:这个是重点。我曾经作过测试,不同的客户连接在OnClientRead里是不会串的(有事件就一定是非线程方式),实际上OnClientRead的SOCKET参数对不同的客户是不同的。但是同一个客户的READ、OPEN、CLOSE事件则有可能会串,我让客户机不断去连接、断开服务器,一连通就马上发数据,这样用不了几次就会出错。所以这种方式有很大的漏洞,还是block的好。
5:你肯定要加同步处理。当然不一定要用临界区,这要看你怎么用了。有很多方法的。

#13


socket编程,ClientSocket与ServerSocket
之间要自行定义一个通讯协议,也就是一个通
讯命令很重要,格式举例如下:
引导串,命令长度,命令串,参数个数,参数等

互相之间按此格式交换数据, 你要自行编程分
析这些命令;
我正在研究这个问题,解决后再发贴子,我喜欢
异步方式通讯,但有一些问题要解决;










#14


to BCB
  自行定义和分析协议是非常简单的

另外,的确可能在一次read里收到几个完整的包,这里要稍加处理。我还没有碰到收包不完整的情况,在JAVA里碰到过。不知道大家有什么看法。我觉得这个保证机制应该是由TCP层提供的,否则,那可是个很麻烦的事情。

#15


回答第二个问题:区分连接是用sockethandle,即serversocket.socket.connections[i].sockethandle.用ip地址是不对的。
第三个问题:用区分连接的方法来区分每个客户发来的包。包当然有可能丢失,那是由于网络的问题,最好先测试一下网络。

#16


多线程Socket通讯是采用阻塞的办法,
一个线程在通讯的时侯, 其它线程
能同时通讯吗?如果一个线程通讯过程中
出现故障,其它线程会不会受到影响?


   





#17


从前4个问题看出你对socket的了解很粗浅, 关于一个套接字的5大组成部分并没有理解.
建议你先读一读关于TCP/IP的基础书籍.
至于同步, 是必须的, 你采测试的时候设置断点是会自动同步各线程的, 不信你不要调试,
运行看看, 很有可能出错.

#18


看了以上回答,觉得还是有些问题
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什么含义,为什么每次连接都不同吗?

#19


to CKEN(2000-12-21 17:16:00) 

1.非永久性的连接,你只能根据他的地址来区分。你可以在连接后立刻取得他的地址。连接时回自动启动一个SOCKET,他的HANDLE是个THANDLE类型,THANDLE等价于INTEGER,4字节长。断开时该SOCKET回自动释放,因此回出现你提到的情况。
2。。。。。。
3。sin_port是端口,端口和IP地址一起组成唯一协议地址。

#20