[Programming] [?] truyền dữ liệu qua socket |
05/03/2008 03:42:13 (+0700) | #1 | 117926 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
mình có thắc mắc khi dùng socket để truyền dữ liệu trên net, bạn nào biết giải thích giùm với nhé.
giả sử mình đã có 1 connection từ A sang B, giờ mình muốn truyền dữ liệu từ A qua B.
dữ liệu ở đây bao gồm thông tin về cấu trúc thư mục và dữ liệu của tất cả các file thư mục đó.
công việc sẽ tiến hành như sau.
1. dùng API search để liệt kê các file có trong thư mục, gửi tên của file đi, đọc nội dung của file, gửi nội dung của file đi.
2. bên nhận đọc dữ liệu và khôi phục lại cấu trúc thư mục và các file y như bên gửi.
problem: sau khi bên gửi gửi hết thông tin 1 file, nó tiếp tục cho các file tiếp theo, nhưng làm sao bên nhận biết được đâu là vị trí kết thúc của file thứ nhất, vì dữ liệu toàn binary cả, lại được truyền liên tục. hay nói cách khác là làm sao bên nhận có thể nhận biết được đâu là dữ liệu của file nào.
rất mong được các bạn góp ý.
|
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
05/03/2008 04:48:22 (+0700) | #2 | 117939 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
Ví dụ, trước khi truyền một file thì truyền 1 số thông tin như kích thước file, thuộc thư mục nào, ngày tạo lập, giá trị checksum... bên nhận sẽ căn cứ vào kích thước ban đầu mà khi ráp nối biết được đến khi nào sẽ cần kết thúc file và bắt đầu file mới, kiểm tra tính toàn vẹn...
Cũng có thể kèm một giá trị đặc biệt đánh dấu khối dữ liệu nào là information, cái nào là data của file. |
|
Hibernating |
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
05/03/2008 05:36:17 (+0700) | #3 | 117946 |
|
vivashadow
Member
|
0 |
|
|
Joined: 08/01/2008 12:36:49
Messages: 95
Offline
|
|
Đúng vậy đơn giản nhất là phải có đánh dấu kết thúc file, khá hơn là gởi thông tin meta (size, checksum,...).
Nhưng nếu muốn chương trình hoạt động tốt, bảo đảm toàn vẹn thông tin (truyền file phải cần), bạn phải xây dựng cơ chế thông điệp hồi đáp 2 chiều, nói đơn giản là bạn tự tạo ra một protocol riêng cho mình. 1 cơ chế cho phép reconnect tự động và tiếp tục công việc bỏ dở. (VD: Chia nhỏ tập tin theo gói tương ứng buffer chẳng hạn, đánh số tt để cho phép gởi lại đoạn buffer đó chứ kô gởi lại từ đầu,...)
...
Tối ưu đến mức nào đó nó sẽ thành giao thức FTP,...Cho nên nếu mục đích của bạn là tìm hiểu, luyện coding hoặc làm các ứng dụng nhỏ cá nhân thì dc, nhưng nếu muốn tốc độ ổn định thì nên nghĩ đến việc sử dụng các giao thức sẵn có.
Good luck! |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
05/03/2008 06:17:57 (+0700) | #4 | 117950 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
cảm ơn các bạn, mình định dùng cho một ứng dụng nhỏ nhỏ thôi, có lẽ sẽ thử cách send dữ liệu mô tả vì sử dụng vị trí đặc biệt không chắc ăn lắm. |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 04:10:19 (+0700) | #5 | 118043 |
PQSONG
Member
|
0 |
|
|
Joined: 05/03/2008 13:41:05
Messages: 4
Offline
|
|
Khi lập trình dùng socket để truyền dữ liệu đặc biệt là truyền file do kích thước lớn nên có khả năng xảy ra tình trạng bội thực.Nghĩa là do dữ liệu gởi quá lớn hay dữ liệu nhận quá nhiều mà kích thước bộ đệm,cũng như tốc độ xử lý ghi hay đọc có giới hạn làm cho dữ liệu không được bảo toàn.Bạn cần khắc phục tình trạng này.Chúc bạn thành công |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 04:50:11 (+0700) | #6 | 118046 |
nbthanh
HVA Friend
|
Joined: 21/12/2001 14:51:51
Messages: 429
Offline
|
|
Zip lại nguyên thư mục, truyền đi, qua đầu kia unzip là có ngay cấu trúc thư mục |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 05:14:33 (+0700) | #7 | 118049 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
cảm ơn PQSONG, về phần bên send mình nghĩ check số byte đã gửi thành công rồi gửi tiếp đi phần còn lại là ok.
1.Thực sự mình chưa biết được chính xác việc gửi dữ liệu qua socket (connection) được tiến hành như thế nào nữa. Có phải là bên gửi sẽ gửi đi một số byte dữ liệu, bên nhận nhận dữ liệu, gửi thông báo lại cho bên gửi số byte mà nó đã nhận ? đó chính là con số trả lại bởi send(...) ? .
2.Về datagram socket, có phải là dữ liệu được truyền đi bởi một lần gọi send(...) có thể được chia thành nhiều mảnh và đi theo các con đường khác nhau, bên nhận sẽ đợi đến khi nhận được tất cả các mảnh này rồi khôi phục lại --> fill vào buffer chỉ ra bởi receive(...) ? Khác với connection socket, các mảnh được gửi đi lần lượt và trên con đường đã định ra ?.
mình sẽ đọc và thực hành để làm rõ mấy vấn đề trên, tuy nhiên vẫn rất hoan nghênh các bạn tham gia thảo luận, chia sẻ kinh nghiệm. thanks. |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 05:30:10 (+0700) | #8 | 118051 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 05:47:23 (+0700) | #9 | 118056 |
PQSONG
Member
|
0 |
|
|
Joined: 05/03/2008 13:41:05
Messages: 4
Offline
|
|
Chào!
Thực sự thì ,có nhiều vấn đề nhìn nảy sinh trong quá trình truyền dữ liệu rất nhiều,đặc biệt là truyền với những file có kích thước lớn và phụ thuộc vào protocol chọn để truyền dữ liệu.Nếu chọn protocol TCP thì nó đã có cơ chế đảm đương việc kiểm tra dữ liệu ,cũng như có cơ chế tự sắp xếp gói tin trong quá trình gởi ,nó được gọi là protocol đáng tin cậy.Còn protocol UDP thì không có chuyện như vậy mà do mình tự thiết lập lấy được gọi là protocol không tin cậy.Mặc dù nói thì vậy,nhưng đôi khi mình gởi dữ liệu quá nhiều cùng một lúc ,cái socket nó chịu không nổi nên sẽ bị mất dữ liệu phải gởi lại,nhưng cứ gởi liên tục như vậy thì đôi khi làm tê liệt socket luôn và không gởi được nữa
Đôi khi nếu gởi file có kích thước lớn khoảng 100M đi thì thường phải dùng thread riêng để đảm nhận việc gởi dữ liệu,vì cùng một lúc ,chương trình đôi khi cho phép gỏi nhiều dữ liệu cùng một lúc,nên sẽ có nhiều socket riêng cho từng thread,khi đó ta nên chọn socket nào không bị "bận" để thực hiện truyền trước (gọi là truyền song song)
Đây là tôi nghĩ vậy,nếu không phải thì thông cảm nha |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 13:42:00 (+0700) | #10 | 118122 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
xem ra cái socket này phải xem xét cẩn thận mới được. Có bạn nào cho ý kiến thêm không ? |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 15:11:17 (+0700) | #11 | 118136 |
FaL
Moderator
|
Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
|
|
Tui có hiểu lan man thế này, ko biết đúng ý bồ hỏi ko:
Dữ liệu được truyền theo sơ đồ:
Code:
Protocol
Local address: local port <---------------------------> Remote address: remote port
Sơ đồ này hoạt động dưới sự điều khiển của 1 process. Tùy theo protocol truyền dữ liệu mà process có nhiệm vụ khác nhau.
Ví dụ:
- Truyền theo TCP/IP (stream socket) - dữ liệu sẽ được gửi lần lượt từng gói. Lúc này process sẽ có nhiệm vụ xác định số lượng gói, kích thước gói,... lúc gửi, và tổng hợp lại lúc nhận.
- Truyền theo UDP (datagram socket) - dữ liệu sẽ được gửi và nhận không theo thứ tự nào cả (mỗi gói dữ liệu sẽ có địa chỉ đàng hoàng). Lúc này process sẽ xác định boundary cho tất cả các gói, đánh địa chỉ,... tổng hợp các gói tin.
Các protocol này đều có chuẩn đi kèm theo, bồ tìm tài liệu đọc xem thử, tui cũng chỉ mò mò internet biết bấy nhiêu thôi. Chưa làm cái process nào cả :p
Thân mến. |
|
Hãy giữ một trái tim nóng và một cái đầu lạnh |
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 16:06:08 (+0700) | #12 | 118139 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
hi Fal, mình tìm thấy một bài bên wiki thấy cũng hay hay, sau đây là một đoạn trích của nó
Difference between TCP and UDP
TCP ("Transmission Control Protocol") is a connection-oriented protocol, which means that upon communication it requires handshaking to set up end-to-end connection. A connection can be made from client to server, and from then on any data can be sent along that connection.
* Reliable - TCP manages message acknowledgment, retransmission and timeout. Many attempts to reliably deliver the message are made. If it gets lost along the way, the server will re-request the lost part. In TCP, there's either no missing data, or, in case of multiple timeouts, the connection is dropped.
* Ordered - if two messages are sent along a connection, one after the other, the first message will reach the receiving application first. When data packets arrive in the wrong order, the TCP layer holds the later data until the earlier data can be rearranged and delivered to the application.
* Heavyweight - TCP requires three packets just to set up a socket, before any actual data can be sent. It handles connections, reliability and congestion control. It is a large transport protocol designed on top of IP.
* Streaming - Data is read as a "stream," with nothing distinguishing where one packet ends and another begins. Packets may be split or merged into bigger or smaller data streams arbitrarily.
UDP is a simpler message-based connectionless protocol. In connectionless protocols, there is no effort made to setup a dedicated end-to-end connection. Communication is achieved by transmitting information in one direction, from source to destination without checking to see if the destination is still there, or if it is prepared to receive the information. With UDP messages (packets) cross the network in independent units.
* Unreliable - When a message is sent, it cannot be known if it will reach its destination; it could get lost along the way. There is no concept of acknowledgment, retransmission and timeout.
* Not ordered - If two messages are sent to the same recipient, the order in which they arrive cannot be predicted.
* Lightweight - There is no ordering of messages, no tracking connections, etc. It is a small transport layer designed on top of IP.
* Datagrams - Packets are sent individually and are guaranteed to be whole if they arrive. Packets have definite bounds and no split or merge into data streams may exist.
http://en.wikipedia.org/wiki/User_Datagram_Protocol, dùng datagram socket trong một số ứng dụng cần độ chính xác cao hơn(DNS) thì có thể thêm công đoạn check dữ liệu lấy về. |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 16:32:45 (+0700) | #13 | 118141 |
FaL
Moderator
|
Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
|
|
Vậy là bồ hiểu protocol rồi, còn thắc mắc chỗ nào nữa? |
|
Hãy giữ một trái tim nóng và một cái đầu lạnh |
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 19:29:03 (+0700) | #14 | 118144 |
StarGhost
Elite Member
|
0 |
|
|
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
|
|
secmask wrote:
xem ra cái socket này phải xem xét cẩn thận mới được. Có bạn nào cho ý kiến thêm không ?
Hì, socket thì có gì phức tạp lắm đâu mà phải cẩn thận. Cái phức tạp chính là ở protocol trên application layer mà bồ sử dụng để truyền dữ liệu. Nếu là sử dụng ý tưởng 1 protocol có sẵn như FTP thì có vẻ ổn nhưng sẽ phức tạp trong việc implement. Ngược lại, nếu tự nghĩ ra 1 protocol thì sẽ dễ implement hơn nhưng lại phải cẩn thận hơn trong việc thiết kế protocol, đặc biệt khi dùng UDP (connectionless), ví dụ khi muốn bypass intermediate firewalls để kết nối 2 máy (cái này ngoài lề nhé, chỉ là 1 trong những lý do cho việc sử dụng UDP thôi).
Cuối cùng, đối với network programming, tốt nhất là nên và chỉ nên tham khảo RFC cho các protocols thông dụng như TCP, UDP, FTP, SSH, v.v... Chỉ trừ khi đọc không thể hiểu nổi thì mới nên đọc các tài liệu khác. Cài này đặc biệt hữu dụng khi bồ đi sâu hơn ví dụ về raw ethernet programming.
|
|
Mind your thought. |
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 22:34:25 (+0700) | #15 | 118166 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
cảm ơn các bạn, qua mấy ngày lang thang trên mạng mình đã thông hơn chút rồi, về mặt lý thuyết thì cũng tạm ổn, giờ cần thực hành thêm cái đã
Hì, socket thì có gì phức tạp lắm đâu mà phải cẩn thận.
^^, mình nói thế vì những vấn đề mà PQSONG đã nêu ra, có gì đó không suôn sẻ khi dùng socket để truyền dữ liệu lớn và trong thời gian dài, vấn đề do protocol hay do library socket ? |
|
|
|
|
[Question] Re: [?] truyền dữ liệu qua socket |
06/03/2008 22:44:36 (+0700) | #16 | 118167 |
share_docs
Member
|
0 |
|
|
Joined: 05/03/2008 16:31:18
Messages: 2
Offline
|
|
Thực ra có thể nói là chú socket làm việc có vấn đề khi truyền kích thước lớn chứ bản thân protocol thì có vấn đề gì đâu(trên VC 6++) nha chứ mấy ngôn ngữ khác thì không biết à |
|
|
|
|
[Question] [?] truyền dữ liệu qua socket |
15/03/2008 03:25:28 (+0700) | #17 | 119362 |
|
haipt
Member
|
0 |
|
|
Joined: 20/08/2004 19:48:44
Messages: 165
Location: Hải phòng
Offline
|
|
secmask wrote:
mình có thắc mắc khi dùng socket để truyền dữ liệu trên net, bạn nào biết giải thích giùm với nhé.
giả sử mình đã có 1 connection từ A sang B, giờ mình muốn truyền dữ liệu từ A qua B.
dữ liệu ở đây bao gồm thông tin về cấu trúc thư mục và dữ liệu của tất cả các file thư mục đó.
công việc sẽ tiến hành như sau.
1. dùng API search để liệt kê các file có trong thư mục, gửi tên của file đi, đọc nội dung của file, gửi nội dung của file đi.
2. bên nhận đọc dữ liệu và khôi phục lại cấu trúc thư mục và các file y như bên gửi.
problem: sau khi bên gửi gửi hết thông tin 1 file, nó tiếp tục cho các file tiếp theo, nhưng làm sao bên nhận biết được đâu là vị trí kết thúc của file thứ nhất, vì dữ liệu toàn binary cả, lại được truyền liên tục. hay nói cách khác là làm sao bên nhận có thể nhận biết được đâu là dữ liệu của file nào.
rất mong được các bạn góp ý.
WINSOCK chỉ truyền dữ liệu dang thô thôi, muốn sử lý dữ liệu truyền như object cùng với các kỹ thuật remote activation thì bạn cần
Tìm hiểu kiến trúc client -server
DCOM với vb6,c,c++
REMOTING với .NET |
|
|
|
|
[Question] [?] truyền dữ liệu qua socket |
15/03/2008 04:01:22 (+0700) | #18 | 119367 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
PhamTienSinh wrote:
secmask wrote:
mình có thắc mắc khi dùng socket để truyền dữ liệu trên net, bạn nào biết giải thích giùm với nhé.
giả sử mình đã có 1 connection từ A sang B, giờ mình muốn truyền dữ liệu từ A qua B.
dữ liệu ở đây bao gồm thông tin về cấu trúc thư mục và dữ liệu của tất cả các file thư mục đó.
công việc sẽ tiến hành như sau.
1. dùng API search để liệt kê các file có trong thư mục, gửi tên của file đi, đọc nội dung của file, gửi nội dung của file đi.
2. bên nhận đọc dữ liệu và khôi phục lại cấu trúc thư mục và các file y như bên gửi.
problem: sau khi bên gửi gửi hết thông tin 1 file, nó tiếp tục cho các file tiếp theo, nhưng làm sao bên nhận biết được đâu là vị trí kết thúc của file thứ nhất, vì dữ liệu toàn binary cả, lại được truyền liên tục. hay nói cách khác là làm sao bên nhận có thể nhận biết được đâu là dữ liệu của file nào.
rất mong được các bạn góp ý.
WINSOCK chỉ truyền dữ liệu dang thô thôi, muốn sử lý dữ liệu truyền như object cùng với các kỹ thuật remote activation thì bạn cần
Tìm hiểu kiến trúc client -server
DCOM với vb6,c,c++
REMOTING với .NET
ok, mình cũng đang muốn truyền dữ liệu thô thôi. |
|
|
|
|
|
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|