[Programming] Cho hỏi về send 1 data structure qua socket trong linux?? |
06/11/2007 00:19:01 (+0700) | #1 | 95511 |
KZM
Member
|
0 |
|
|
Joined: 21/07/2006 17:01:06
Messages: 58
Offline
|
|
Mình đang làm 1 bài tập như sau:
Code:
Thiết kế và lập trình một hệ thống client – server thực hiện các chức năng sau: Client và server trao đổi thông tin với nhau thông qua TCP socket. Có 3 loại bản tin khác nhau:
Bản tin hello (client -> server): Bản tin hello sẽ gồm 4 trường theo thứ tự sau:
o Trường nhận dạng: là 1 chuỗi gồm 11 ký tự (kể cả ký tự NULL ở cuối cùng): dientu-K48. Nếu chuỗi ký tự nhận được không giống với chuỗi ký tự kể trên thì cả bản tin sẽ bị bỏ qua.
o Trường kích thước bản tin: chứa một số nguyên 32bit. Trường này chỉ thị độ dài của toàn bộ bản tin hello.
o Trường nhận dạng bản tin: là một số nguyên 32 bit, quy ước bản tin trong bản tin hello thì trường này có giá trị 0.
o Trường nhận dạng người gửi: trường này chứa email của sinh viên lập trình và ký tự NULL ở cuối (thí dụ <a href="mailto:tran_van_a@yahoo.com">tran_van_a@yahoo.com</a>).
Bản tin acknowledgement (server -> client): Khi nhận được bản tin hello, server sẽ trả lời client bằng bản tin acknowledgement bao gồm 5 trường:
o Trường nhận dạng: Tương tự bản tin hello.
o Trường kích thước bản tin: tương tự bản tin hello.
o Trường nhận dạng bản tin: là một số nguyên 32 bit, quy ước bản tin trong bản tin acknowledgement thì trường này có giá trị 1.
o Trường nhận dạng client: trường này trả lại email của sinh viên lập trình mà server nhận được trong bản tin hello.
o Trường trạng thái: là một chuỗi ký tự thể hiện trạng thái server như “success” hoặc “failed”.
Bản tin bye (client -> server): Khi nhận được bản tin acknowledgement, client sẽ gửi trả server bản tin bye bao gồm 2 trường:
o Trường nhận dạng: Tương tự bản tin hello.
o Trường nhận dạng bản tin: là một số nguyên 32 bit, quy ước bản tin trong bản tin bye thì trường này có giá trị 2.
Phía client sẽ gửi bản tin hello đến server khi chạy chương trình (có tên là client) theo cú pháp sau: client <host-name of server> (địa chỉ port tùy ý do sinh viên tự chọn), khi nhận được hello, server sẽ hiển thị email người gửi, lưu email người gửi vào một danh sách email (một array có kiểu string), sau đó trả lời client bằng bản tin acknowledgement với trường trạng thái là “success” nếu việc lưu email thành công, nếu không trường trạng thái có nội dung là “failed”. Khi nhận được bản tin acknowledgement, client sẽ hiển thị nội dung của trường nhận dang client và trường trạng thái lên màn hình, gửi bản tin bye sau đó đóng socket. Server nhận được bản tin bye thì hiển thị dòng chữ “remote client closes socket” sau đó cũng đóng socket tương ứng với client đó.
Mình định tạo mới 1 structure hello,ack,bye có các trường tương ứng với các bản tin trên. Nhưng mình chưa biết khi đã tạo đ.c 1 structure như thế thì gửi wa socket như thế nào: có phải chuyển sang dạng network-byte-order ko?, hàm nào để send 1 structure, hàm nào để nhận 1 structure?, khi nhận được rồi thì có phải chuyển về dạng host-byte-order ko?
Mong các bạn cho ý kiến giúp đỡ. |
|
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
06/11/2007 00:38:42 (+0700) | #2 | 95515 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
1 structure cũng là 1 buffer memory thôi bồ, cứ chỉ định địa chỉ đầu của buffer (con trỏ đến 1 đối tượng kiểu structure) và chỉ định kích thước cụ thể của nó (sizeof (struct))
Code:
send(int s , const void * buf , size_t len , int flags );
|
|
Hibernating |
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
06/11/2007 12:30:51 (+0700) | #3 | 95626 |
KZM
Member
|
0 |
|
|
Joined: 21/07/2006 17:01:06
Messages: 58
Offline
|
|
Thanks bác zorro! Mình đã send, recv được structure mình tạo ra.
Nhưng đến đây mình nhận thấy là việc mỗi kiểu gói tin lại tạo ra 1 kiểu structrure mới có vẻ không hợp lý lắm.
Mình muốn tạo 1 header cho giao thức mới này( có tạm gọi như thế cho oai ). Các bác có thể cho ý kiến giúp đỡ không ạ.
Thứ 2 là mình muốn hỏi là phải thêm những câu lệnh gì để chỉ cần viết 1 lần nhưng có thể biên dịch để chạy trên nhiều OS(cái này mình thấy họ dùng ifdef j` đo',nhưng chưa hiểu lắm). |
|
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
07/11/2007 05:34:29 (+0700) | #4 | 95792 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
Đúng, ko nên tạo mỗi loại message một structure riêng, trừ khi thông tin của chúng hoàn toàn khác biệt. Tuy nhiên còn tùy vào thiết kế, công cụ và ngôn ngữ sử dụng mà sử dụng 1 cách hợp lý. Ví dụ bồ có thể tạo 1 struct chứa các data chung nhất, các struct còn lại sẽ sử dụng lại (hoặc kế thừa) phần dữ liệu cơ sở đó.
Muốn mã nguồn biên dịch được trên nhiều platform cần chỉ định rõ cho trình biên/thông dịch biết thông qua các compiler directive của ngôn ngữ đang sử dụng. Ví dụ với C/C++ thì sử dụng các directive #if ... #elif ...#else ...#endif
Chỉ sử dụng các directive này khi có những phần mã rất đặc thù chỉ có ở 1 platform, ví dụ các Windows API thì ko thể sử dụng trên Unix based platform, còn các mã thuần C/C++ thì có thể dùng chung.
Ví dụ:
Code:
#if (defined WIN32) || (defined _WINDOWS)
đoạn mã compile trên Windows;
#elif (defined __LINUX__)
đoạn mã compile trên Linux;
#else
#error OS specification is required.
#endif
Các định nghĩa WIN32, _WINDOWS, _WINDOWS_, _LINUX_, .... có thể được định nghĩa sẵn bởi compiler hoặc người dùng tự định nghĩa ra. Nếu tự tạo thì cần chỉ rõ ở tệp hoặc phần nào cần compile phân định bằng cách sử dụng #define _LINUX, .... |
|
Hibernating |
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
07/11/2007 15:37:26 (+0700) | #5 | 95932 |
KZM
Member
|
0 |
|
|
Joined: 21/07/2006 17:01:06
Messages: 58
Offline
|
|
Z0rr0 wrote:
Đúng, ko nên tạo mỗi loại message một structure riêng, trừ khi thông tin của chúng hoàn toàn khác biệt. Tuy nhiên còn tùy vào thiết kế, công cụ và ngôn ngữ sử dụng mà sử dụng 1 cách hợp lý. Ví dụ bồ có thể tạo 1 struct chứa các data chung nhất, các struct còn lại sẽ sử dụng lại (hoặc kế thừa) phần dữ liệu cơ sở đó.
Cái phần tạo header mình vẫn thấy tù mù thế nào ý. Nếu ai rành về vụ này có thể lấy header của 1 ứng dụng thực tế như header của giao thức http, giải thích giúp không? |
|
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
08/11/2007 00:07:50 (+0700) | #6 | 95970 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
Bài tập của bồ yêu cầu có 3 bản tin, trong đó phần lớn nội dung giống nhau. Có thể tận dụng kĩ thuật hướng đối tượng để thiết kế các đối tượng bản tin, cần gì coi mấy cái giao thức kia cho phức tạp. |
|
Hibernating |
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
08/11/2007 16:35:30 (+0700) | #7 | 96184 |
KZM
Member
|
0 |
|
|
Joined: 21/07/2006 17:01:06
Messages: 58
Offline
|
|
Z0rr0 wrote:
Bài tập của bồ yêu cầu có 3 bản tin, trong đó phần lớn nội dung giống nhau. Có thể tận dụng kĩ thuật hướng đối tượng để thiết kế các đối tượng bản tin, cần gì coi mấy cái giao thức kia cho phức tạp.
Thực ra thì bản thân mình thấy cái đề bài này rất chuối, nội dung không rõ ràng. Nếu chỉ làm theo những j` đề bài yêu cầu thì không có gì khó, nhưng nó chỉ giúp mình tìm hiểu đôi chút về lập trình socket trên linux. Vì thế mình muốn thảo luận rộng ra, và lấy ví dụ thực tế về giao thức http. |
|
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
08/11/2007 20:53:21 (+0700) | #8 | 96204 |
rcrackvn
Elite Member
|
0 |
|
|
Joined: 27/03/2007 02:04:05
Messages: 42
Offline
|
|
KZM wrote:
Thanks bác zorro! Mình đã send, recv được structure mình tạo ra.
Nhưng đến đây mình nhận thấy là việc mỗi kiểu gói tin lại tạo ra 1 kiểu structrure mới có vẻ không hợp lý lắm.
Mình muốn tạo 1 header cho giao thức mới này( có tạm gọi như thế cho oai ). Các bác có thể cho ý kiến giúp đỡ không ạ.
Thứ 2 là mình muốn hỏi là phải thêm những câu lệnh gì để chỉ cần viết 1 lần nhưng có thể biên dịch để chạy trên nhiều OS(cái này mình thấy họ dùng ifdef j` đo',nhưng chưa hiểu lắm).
Vụ "tạo header" thì ông kiếm cái giao thức đơn giản như socks 5, đọc rfc của nó (khoảng vài trang), kiếm 1 socks server trên sourceforge đọc là hiểu.
Còn vụ ông muốn viết code không phụ thuộc vào platform, cơ bản ông có thể làm như hướng dẫn của bạn Zorro, nhưng làm như vậy là thủ công, và đòi hỏi ông phải có access và hiểu rõ những đặc tính của 1 platform, để biết thứ gì platform này có mà platform kia không mà write checks cho đúng. Cách mọi người thường làm là sử dụng bộ GNU Build System như autoconf, automake.
Về phần các structure của ông, ngoài cách của bạn Zorro là pack lại những data chung thành 1 struct. Nếu không muốn nest các struct lại, còn 1 cách nữa là sử dụng writev(). writev() có thể collect data source từ nhiều buffer để write thành 1 khối thống nhất, như ông muốn. Cái này gọi là gather write technique (data được "gather" từ nhiều source để write) |
|
|
|
|
[Question] Re: Cho hỏi về send 1 data structure qua socket trong linux?? |
26/10/2008 14:35:52 (+0700) | #9 | 156651 |
thuti13
Member
|
0 |
|
|
Joined: 25/10/2008 20:08:26
Messages: 2
Offline
|
|
To KZM: Bác có thể gửi cho em code bài tập của bác được không ạ? |
|
|
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|
|
|