X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ff021a73f0cd26b2f27ca729783aa486393f9b3a..3d0d626e19a7b79320e7d922c9c1dcf122076cea:/cruft/doc/tmpl/gras-unused.sgml diff --git a/cruft/doc/tmpl/gras-unused.sgml b/cruft/doc/tmpl/gras-unused.sgml index 8f6458650d..c26a9bf998 100644 --- a/cruft/doc/tmpl/gras-unused.sgml +++ b/cruft/doc/tmpl/gras-unused.sgml @@ -1,3 +1,141 @@ + +In order to allow GRAS to send data over the network (or simply to +dupplicate it in SG), you have to describe the structure of data attached +with each message. This mecanism is stolen from NWS message passing +interface. + +For each message, you have to declare a structure representing the +data to send as payload with the message. + + + Sending (or receiving) simple structures + Let's imagin you want to declare a STORE_STATE + message, which will send some data to the memory server for inclusion in + the database. Here is the structure we want to send: + + + struct state { + char id[STATE_NAME_SIZE]; + int rec_size; + int rec_count; + double seq_no; + double time_out; + }; + + + And here is the structure description GRAS needs to be able to send + this over the network: + + + const static DataDescriptor stateDescriptor[] = + {SIMPLE_MEMBER(CHAR_TYPE, STATE_NAME_SIZE, offsetof(struct state, id)), + SIMPLE_MEMBER(INT_TYPE, 1, offsetof(struct state, rec_size)), + SIMPLE_MEMBER(INT_TYPE, 1, offsetof(struct state, rec_count)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(struct state, seq_no)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(struct state, time_out))}; + + + Contrary to what one could think when you first see it, it's pretty + easy. A structure descriptor is a list of descriptions, describing each + field of the structure. For example, for the first field, you say that + the base type is CHAR_TYPE, that there is + STATE_NAME_SIZE element of this type and that it's + position in the structure is computed by offsetof(struct state, + id). This leads to two remarks: + + + + it's impossible to send dynamic sized strings that way. It's a + known limitation, but I think we can live with it. + + + Yes, the offsetof(struct state, id) + construction is C ANSI and is portable. + + + + + + Sending (or receiving) complex structure + How to send non-flat structures, do you ask? It's not harder. Let's + imagin you want to send the following structure: + + + typedef struct { + unsigned long address; + unsigned long port; + } CliqueMember; + + typedef struct { + char name[MAX_CLIQUE_NAME_SIZE]; + double whenGenerated; + double instance; + char skill[MAX_SKILL_SIZE]; + char options[MAX_OPTIONS_SIZE]; + double period; + double timeOut; + CliqueMember members[MAX_MEMBERS]; + unsigned int count; + unsigned int leader; + } Clique; + + + As you can see, this structure contains an array of another user + defined structure. To be able to send struct Clique, + you have to describe each structures that way: + + + static const DataDescriptor cliqueMemberDescriptor[] = + {SIMPLE_MEMBER(UNSIGNED_LONG_TYPE, 1, offsetof(CliqueMember, address)), + SIMPLE_MEMBER(UNSIGNED_LONG_TYPE, 1, offsetof(CliqueMember, port))}; + + static const DataDescriptor cliqueDescriptor[] = + {SIMPLE_MEMBER(CHAR_TYPE, MAX_CLIQUE_NAME_SIZE, offsetof(Clique, name)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, whenGenerated)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, instance)), + SIMPLE_MEMBER(CHAR_TYPE, MAX_SKILL_SIZE, offsetof(Clique, skill)), + SIMPLE_MEMBER(CHAR_TYPE, MAX_OPTIONS_SIZE, offsetof(Clique, options)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, period)), + SIMPLE_MEMBER(DOUBLE_TYPE, 1, offsetof(Clique, timeOut)), + {STRUCT_TYPE, MAX_MEMBERS, offsetof(Clique, members), + (DataDescriptor *)&cliqueMemberDescriptor, cliqueMemberDescriptorLength, + PAD_BYTES(CliqueMember, port, unsigned long, 1)}, + SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(Clique, count)), + SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(Clique, leader))}; + + + So, even if less natural, it is possible to send structures + containing structures with these tools. + + You can see that it's not only impossible to send dynamic-sized + strings, it impossible to send dynamic-sized arrays. Here, + MAX_MEMBERS is the maximum of members a clique can + contain. In NWS, this value is defined to 100. I'm not + sure, but I think that all the 100 values are sent each time, even if + there is only 3 non-null members. Yes, that's + bad. + + The DataDescriptor_t MUST be const. Malloc'ing them and + then casting them on argument passing IS NOT OK. This is because we get + the number of elements in the array with the sizeof(dd)/sizeof(dd[0]). + + + + + + + + + + + +Describing the data + + + +DataDescriptor API + + @@ -18,6 +156,106 @@ ErrLog + + + + + + + + + + + + + +Handling sockets + + + +Sockets API + + + + + + + + + + + + + + + + + + + +comm_callbacks + + + + + + + + + + + + + + + + + + + +comm_cb + + + + + + + + + + + + + + + +Advanced ways to describe data (for experts) + + + +Advanced Data description + + + + + + + + + + + + + + + + + + + +Data description callbacks persistant state + + @@ -38,6 +276,46 @@ ErrLog config + + + + + + + + + + + + + + + + + +Data description callbacks persistant state + + + + + + + + + + + + + + + + + + + +Implementation of data description + + @@ -170,6 +448,125 @@ Overview gras + + + + + + + + + + + + + + + + + +gras_private + + + + + + + + + + + + + + + +Implementation of GRAS suited for real life. + + + +RL + + + + + SimGrid was designed to ease the comparison of algorithms and + heuristics. That way, a lot of complicated notion from the system layer + were volontary left off. For example, migrating a process from an host to + another is as easy as: MSG_process_change_host(process, new_host). + + + + No need to tell that performing this operation on real platform is really + harder. This simplification is a very good thing when you want to rapidly + prototype code, but makes things somehow more complicated in GRAS since + we want to have a realistic API, since it have to be implemented in + reality also. + + + + The best example of complexity in GRAS_SG induced by simplicity in + SimGrid is the sockets handling. There is no "socket" in SG, but only + m_channel_t. In contrary to sockets from RL, no special treatment is + needed for a process before writing or reading on/from a channel. So, a + given channel can be pooled by more than one process. Likewise, you can + send data to a channel that nobody is actually listening to. + + + + The SG implementation of GRAS repport as an error the fact that nobody is + listening to the socket when trying to open a socket, or send stuff using + a previously openned socket. That way, the SG version can be used to + debug all syncronization issues. For that, we store mainly the PID of + both the sender and the receiver in the socket structure, and then + resolve PID->process at the lastest moment. This search is a bit + expensive, but as long as there is no real garbage collection in SG, with + the information "dead process" within the structure, it's the only + solution to make sure that we won't dereference pointers to an old freed + structure when the process on the other side of the structure did finish + since the creation of the socket. + + + + As said in the overview, the processes can declare to hear on several + sockets, but all incoming messages are handled by the same loop. So, we + can use only one channel per process, and use a table on each host to + determine to which process a message should be delivered depending on the + socket number provided by the sender. + + + + + +RL, the implementation suited for real life. + + + + + + +Implementation of GRAS on top of the simulator. + + + +SG + + @@ -190,6 +587,26 @@ gras nws_comm + + + + + + + + + + + + + + + + + +Sockets + + @@ -259,6 +676,20 @@ nws_comm @a4: @a5: + + + + + +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -322,6 +753,20 @@ nws_comm @a4: @a5: + + + + + +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -385,6 +830,20 @@ nws_comm @a4: @a5: + + + + + +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -448,6 +907,20 @@ nws_comm @a4: @a5: + + + + + +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -589,35 +1062,173 @@ nws_comm @a4: @a5: - + -@addr: -@Param2: -@sock: -@timeOut: -@Returns: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: - + -@pid: -@parentToChild: -@childToParent: -@Returns: +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: - + -@sock: -@Returns: - +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + + + + + + +@c: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + + + + + + +@addr: +@Param2: +@sock: +@timeOut: +@Returns: + + + + + + +@sock: +@waitForPeer: +@Returns: + + + + + + +@destination: +@source: +@description: +@length: +@sourceFormat: + + + + + + +@pid: +@parentToChild: +@childToParent: +@Returns: + + + + + + +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + + + + + + +@sock: +@Returns: + + + + + + +@description: +@length: +@format: +@Returns: + + + + + + +@CHAR_TYPE: +@DOUBLE_TYPE: +@FLOAT_TYPE: +@INT_TYPE: +@LONG_TYPE: +@SHORT_TYPE: +@UNSIGNED_INT_TYPE: +@UNSIGNED_LONG_TYPE: +@UNSIGNED_SHORT_TYPE: +@STRUCT_TYPE: +@LAST_TYPE: + + + + + + +@whatType: +@Returns: + + + + + + +@Returns: + + + + + + +@whatType: +@Returns: + @@ -630,6 +1241,19 @@ nws_comm + + + + + +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -641,18 +1265,92 @@ nws_comm @earPort: @Returns: + + + + + +@HOST_FORMAT: +@NETWORK_FORMAT: + + + + + + +@name: +@def: + + + + + + +@cname: + + + + + + +@cname: + + + + + + +@catName: +@priority: + + + + + + +@catName: + + + + + + +@cname: + + + + + + +@cname: +@parent: + + + + + + +@catName: +@parent: + + + + + + + @@ -719,6 +1417,40 @@ nws_comm + + + + + +@destination: +@source: +@whatType: +@repetitions: +@sourceFormat: + + + + + + +@whatType: +@repetitions: +@format: +@Returns: + + + + + + +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + @@ -899,6 +1631,16 @@ nws_comm + + + + + +@structType: +@lastMember: +@memberType: +@repetitions: + @@ -932,109 +1674,182 @@ nws_comm @sd: @Returns: - + +@destination: +@source: +@whatType: +@repetitions: +@format: - + +@type: +@repetitions: - + -@sig: +@type: +@repetitions: +@offset: - + -@Param1: - + -@sd: -@Returns: - + -@sd: -@Returns: - + +@sig: - + -@sd: -@msgType: -@vdata: +@Param1: - + -@sock: +@sd: @Returns: - + -@dd1: -@c1: -@dd2: -@c2: +@sd: @Returns: -@description: - + -@description: -@Returns: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: - + -@sd: -@data: -@description: -@description_length: -@repetition: -@Returns: - + -@sd: +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + + + + + + +@f: +@a1: +@a2: +@a3: +@a4: +@a5: +@a6: + + + + + + +@sd: +@msgType: +@vdata: + + + + + + +@sock: +@Returns: + + + + + + +@dd1: +@c1: +@dd2: +@c2: +@Returns: +@description: + + + + + + +@description: +@Returns: + + + + + + +@sd: +@data: +@description: +@description_length: +@repetition: +@Returns: + + + + + + +@sd: @data: @description: @description_length: @@ -1135,6 +1950,16 @@ nws_comm @Varargs: @Returns: + + + + + +@msg: +@timeout: +@Returns: +@sd: + @@ -1274,38 +2099,1864 @@ nws_comm @ud: - + -@dynar: -@cursor: @Returns: - + + + + + +@msgtype: +@cb: +@Returns: +@message: +@TTL: + + + + + + +@expeditor: +@payload: +@Returns: +@payload_type: +@payload_data: +@msg: + + + + + + +@msgtype: +@cb: + + + + + + +@ps: + + + + + + +@ps: + + + + + + +@ps: +@Returns: + + + + + + +@ps: +@val: + + + + + + +@ps: +@name: +@ddt: + + + + + + +@ps: +@name: +@ddt: +@res: +@Returns: + + + + + + +@ps: +@name: +@data: +@ddt: +@Returns: + + + + + + +@ps: +@name: +@data: +@ddt: + + + + + + +@cfg: +@Returns: + + + + + + +@whereto: +@tocopy: +@Returns: + + + + + + +@name: +@indent: +@cfg: + + + + + + +@cfg: +@name: +@Returns: + + + + + + +@cfg: + + + + + + +@cfg: +@name: +@val: +@Returns: + + +@cfg: +@name: @dynar: -@cursor: +@Returns: + + + + + + +@cfg: +@name: +@host: +@port: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + @whereto: @Returns: - + -@cat: -@parent: +@cfg: +@name: +@type: +@min: +@max: +@Returns: - + -@cat: -@thresholdPriority: +@cfg: +@entry: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@name: +@host: +@port: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@Varargs: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@name: +@host: +@port: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@options: +@Returns: + + + + + + +@cfg: +@name: +@val: +@Returns: + + + + + + +@cfg: +@pa: +@Returns: + + + + + + +@name: +@element_type: +@dynamic_size: +@dst: +@Returns: + + + + + + +@name: +@element_type: +@fixed_size: +@dst: +@Returns: + + + + + + +@name: +@Returns: +@type: + + + + + + +@name: + + + + + + +@type: +@post: + + + + + + +@type: +@pre: + + + + + + +@type: +@post: + + + + + + +@type: +@pre: + + + + + + +@d1: +@d2: +@Returns: +@dd1: +@c1: +@dd2: +@c2: + + + + + + +@dd: +@c: +@data: + + + + + + +@name: +@elm_type: +@size: +@code: + + + + + + +@name: +@element_type: +@fixed_size: +@dynamic_size: +@post: +@code: +@Returns: + + + + + + +@name: +@element_type: +@dynamic_size: +@dst: +@Returns: +@elm_type: +@code: + + + + + + +@name: +@element_type: +@fixed_size: +@dst: +@Returns: + + + + + + +@name: +@referenced_type: +@dst: +@Returns: +@ref_type: +@code: + + + + + + +@name: +@referenced_type: +@discriminant: +@post: +@code: +@Returns: + + + + + + +@name: +@discriminant: +@code: + + + + + + +@name: +@discriminant: +@dst: +@Returns: + + + + + + +@name: +@dst: +@Returns: +@code: + + + + + + +@struct_code: +@field_name: +@field_type_code: + + + + + + +@struct_code: +@field_name: +@field_code: +@pre_cb: +@post_cb: +@Returns: + + + + + + +@struct_code: +@field_name: +@field_type_name: + + + + + + +@struct_code: +@field_name: +@field_type_name: +@pre_cb: +@post_cb: +@Returns: + + + + + + +@struct_type: +@name: +@field_type: +@Returns: + + + + + + +@struct_type: +@name: +@field_type_name: +@Returns: + + + + + + +@name: +@pre_cb: +@post_cb: +@code: +@Returns: + + + + + + +@struct_type: + + + + + + +@name: +@selector: +@dst: +@Returns: +@code: + + + + + + +@union_code: +@field_name: +@field_type_code: + + + + + + +@union_code: +@field_name: +@field_code: +@pre_cb: +@post_cb: +@Returns: + + + + + + +@union_code: +@field_name: +@field_type_name: + + + + + + +@union_code: +@field_name: +@field_type_name: +@pre_cb: +@post_cb: +@Returns: + + + + + + +@union_type: +@name: +@field_type: +@Returns: + + + + + + +@union_type: +@name: +@field_type_name: +@Returns: + + + + + + +@name: +@field_count: +@post: +@code: +@Returns: + + + + + + +@union_type: + + + + + + +@name: +@desc: +@howmany: +@code: +@Returns: +@dst: + + + + + + +@name: +@desc: +@howmany: +@dst: +@Returns: + + + + + + +@name: +@Cdefinition: +@dst: +@Returns: +@code: +@def: + + + + + + +@name: +@referenced_type: +@dst: +@Returns: + + + + + + +@name: +@selector: +@dst: +@Returns: +@discriminant: + + + + + + +@element_type: +@dst: +@Returns: + + + + + + +@name: +@dst: +@Returns: + + + + + + +@struct_type: +@name: +@field_type: +@Returns: + + + + + + +@struct_type: + + + + + + +@vars: +@data: +@Returns: +@p_type: + + + + + + +@vars: +@data: +@p_type: + + + + + + +@name: +@selector: +@dst: +@Returns: + + + + + + +@union_type: +@name: +@field_type: +@Returns: + + + + + + +@union_type: + + + + + + +@ps: + + + + + + +@ps: + + + + + + +@ps: +@name: +@ddt: + + + + + + +@ps: +@name: +@ddt: + + + + + + +@ps: +@name: +@data: +@ddt: + + + + + + +@ps: +@name: +@data: +@ddt: + + + + + + +@type: + + + + + + +@code: +@type: +@Returns: + + + + + + +@name: +@type: +@Returns: + + + + + + +@name: +@element_type: +@fixed_size: +@dynamic_size: +@post: +@dst: +@Returns: + + + + + + +@name: +@desc: +@howmany: +@dst: +@Returns: + + + + + + +@name: +@default_value: +@free_func: +@size: +@alignment: +@post: +@dst: +@Returns: + + + + + + +@name: +@C_definition: +@dst: +@Returns: + + + + + + +@name: +@referenced_type: +@discriminant: +@post: +@dst: +@Returns: + + + + + + +@name: +@type: +@Returns: + + + + + + +@name: +@pre: +@post: +@dst: +@Returns: + + + + + + +@struct_type: +@name: +@field_type: +@pre: +@post: +@Returns: + + + + + + +@name: +@field_count: +@post: +@dst: +@Returns: + + + + + + +@union_type: +@name: +@field_type: +@pre: +@post: +@Returns: + + + + + + +@type: +@Returns: + + + + + + +@cursor: +@Returns: + + + + + + +@cursor: +@data: +@Returns: + + + + + + +@cursor: +@key: +@Returns: + + + + + + +@head: +@cursor: +@Returns: + + + + + + +@cursor: +@Returns: + + + + + + +@cursor: +@Returns: + + + + + + +@head: +@output: +@Returns: + + + + + + +@dict: +@cursor: +@key: +@data: + + + + + + +@dict: +@Returns: + + + + + + +@head: +@key: +@data: +@Returns: + + + + + + +@head: +@key: +@key_len: +@data: +@Returns: + + + + + + +@head: +@key: +@data: +@free_ctn: +@Returns: + + + + + + +@head: +@key: +@key_len: +@data: +@free_ctn: +@Returns: + + + + + + +@dict: +@Returns: + + + + + + +@data: + + + + + + +@data: + + + + + + +@head: +@key: +@Returns: + + + + + + +@head: +@key: +@key_len: +@Returns: + + + + + + +@head: +@key: +@data: +@Returns: + + + + + + +@head: +@key: +@key_len: +@data: +@Returns: + + + + + + +@head: +@key: +@data: +@free_ctn: +@Returns: + + + + + + +@head: +@key: +@key_len: +@data: +@free_ctn: +@Returns: + + + + + + +@dynar: +@cursor: + + + + + + +@dynar: +@cursor: +@whereto: +@Returns: + + + + + + +@dynar: +@cursor: + + + + + + +@dynar: +@cursor: + + + + + + +@dynar: +@cursor: +@Returns: + + + + + + +@_dynar: +@_cursor: +@_data: +@_whereto: + + + + + + +@dynar: +@Returns: + + + + + + +@dynar: +@Returns: + + + + + + +@dynar: +@idx: +@dst: +@whereto: +@Returns: + + + + + + +@dynar: +@idx: +@src: +@Returns: +@object: + + + + + + +@dynar: +@Returns: + + + + + + +@dynar: +@operator: +@Returns: + + + + + + +@whereto: +@elm_size: +@free_func: +@Returns: + + + + + + +@dynar: +@cursor: +@whereto: +@Returns: + + + + + + +@dynar: +@dst: +@whereto: + + + + + + +@dynar: +@src: +@Returns: +@object: + + + + + + +@dynar: +@idx: +@object: +@Returns: + + + + + + +@dynar: +@idx: +@object: +@Returns: + + + + + + +@dynar: +@Returns: + + + + + + +@dynar: +@idx: +@src: +@Returns: +@object: + + + + + + +@dynar: +@dst: +@whereto: +@Returns: + + + + + + +@dynar: +@src: +@Returns: +@object: + + + + + + +@no_error: no error +@malloc_error: Well known error +@mismatch_error: Not found +@system_error: a syscall did fail +@network_error: error while sending/receiving data +@timeout_error: not quick enough, dude +@thread_error: error while [un]locking +@unknown_error: no idea + + + + + + +@Returns: + + + + + + +@cat: +@app: + + + + + + +@cs: +@Returns: + + + + + + + + + + + + +@cat: +@parent: + + + + + + +@gras_log_priority_none: +@gras_log_priority_trace: +@gras_log_priority_debug: +@gras_log_priority_verbose: +@gras_log_priority_info: +@gras_log_priority_warning: +@gras_log_priority_error: +@gras_log_priority_critical: +@gras_log_priority_infinite: +@gras_log_priority_uninitialized: + + + + + + +@cat: +@thresholdPriority: + + + + + + +@sd: +@size: + + + + + + +@msg: + + + + + + +@timeOut: +@Returns: + + + + + + +@msgId: +@free_data_on_free: +@seqCount: +@Varargs: +@Returns: + + + + + + +@sock: +@msgtype: +@payload: +@Returns: +@sd: +@msg: +@freeDirective: + + + + + + +@timeout: +@msgt_want: +@expeditor: +@payload: +@Returns: +@id: +@message: + + + + + + +@name: +@Returns: +@dst: + + + + + + +@name: +@version: +@Returns: +@dst: + + + + + + +@name: +@payload: +@Returns: +@dst: + + + + + + +@name: +@version: +@payload: +@Returns: +@dst: + + + + + + +@msgId: +@name: +@sequence_count: +@Varargs: +@Returns: + + + + + + +@Param1: +@Param2: + + + + + + +@Returns: + + + + + + +@set: +@elm: +@free_func: +@Returns: + + + + + + +@set: +@cursor: +@elm: + + + + + + +@set: + + + + + + +@set: +@id: +@dst: +@Returns: + + + + + + +@set: +@key: +@dst: +@Returns: + + + + + + +@set: +@name: +@name_len: +@dst: +@Returns: + + + + + + +@dst: +@Returns: + + + + + + +@Param1: +@Param2: + + + + + + +@host: +@Param2: +@sock: +@Returns: + + + + + + +@sock: +@Returns: + + + + + + +@sd: +@Returns: + + + + + + +@sd: +@Returns: + + + + + + +@Param1: +@Param2: +@sock: +@Returns: + + + + + + +@host: +@Param2: +@dst: +@Returns: +@bufSize: +@sock: + + + + + + +@sd: +@sock: +@Returns: + + + + + + +@sock: +@Returns: + + + + + + +@sock: +@Returns: +@sd: + + + + + + +@sock: +@Returns: + + + + + + +@Param1: +@dst: +@Returns: +@bufSize: + + + + + + +@Returns: + + + + + + +@Returns: + + + + + + + + + + + + +@type: + + + + + + +@ud: