6.论述数据传输——send()与recv()
当一个连接建立以后,就可以进行数据传输。常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接口上发送传输数据,格式如下:
int send(SOCKETs.const char FAR*buf,int len,int flags);
参数s为已连接的本地套接口描述符。buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输控制方法,如是否
发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR.
recv()调用用于在参数s指定的已连接的数据报或流套接口上接收输入数据,格式如下:
int recv(SOCKETs,char FAR*buf,int len,int len,int flags);
参数s为已连接的套接口描述符。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否接收
外带数据等。如果没有错误发生,recv()返回总共接收的字节数,如果连接被关闭,返回0。否则它返回SOCKET_ERROR.
三、案例分析
阅读程序段,解释每个程序语句。
byte=0x45;
memcpy(p_ptr,&byte,sizeof(u_char);
p_ptr+=2;
*((u_short*)p_ptr)=FIX(IPH+UDPH+PADDING);
p_ptr+=2;
*((u_short*)p_ptr)=htons(242);
p_ptr+=2;
*((u_short*)p_ptr)=FIX(IP_MF);
p_ptr+=2;
*((u_short*)p_ptr)=0x40;
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byte,sizeof(u_char));
p_ptr+=4;
*((u_long*)p_ptr)=src_ip;
p_ptr+=4;
*((u_long*)p_ptr)=dst_ip;
p_ptr+=4;
*((u_short*)p_ptr)=htons(src_prt);
p_ptr+=2;
*((u_short*)p_ptr)=htons(dst_prt);
p_ptr+=2;
*((u_short*)p_ptr)=htons(8+PADDING);
if(sendto(sock,packet, IPH+UDPH+PADDING,0,(struct sockaddr*)&sin,sizeof(struct sockaddr))= = -1){
perror(“\nsendto”);
free(packet);
exit(1);
}
答案:
byte=0x45;/*IP version and header length */ ip版本和头长
memcpy(p_ptr,&byte,sizeof(u_char));
p_ptr+=2;/*IP TOS(skipped)*/ ip的tos值
*((u_short*)_ptr)=FIX(IPH+UDPH+PADDING);/*total length*/ ip的长度
p_ptr+=2;
*((u_short*)_ptr)=htons(242);/*IP id */ ip的标识
p_ptr+=2;
*((u_short*)_ptr)=FIX(IP_MF);/*IP frag flags and offset */ ip的分段标识符
p_ptr+=2;
*((u_short*)_ptr)=0x40;/*IP TTL */ ip的生存时间
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byt,sizeof(u_char));
p_ptr+=4;/*IP checksum filled in by kernel */ ip的校验和
*((u_long *)p_ptr)=scr_ip;/* IP source address */ ip的源地址
p_ptr+=4;
*((u_long *)p_ptr)=dst_ip;/* IP destination address */ ip的目标地址
p_ptr+=4;
*((u_long *)p_ptr)=htons(scr_ptr);/* UDP source potr */ UDP的源地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(dst_ptr);/* UDP destination */ UDP的目标地址
p_ptr+=2;
*((u_long *)p_ptr)=htons(8+PADDING);/*UDP total length */ ip的总长度
if(sendto(sock,packed,IPH+UDPH+PADDING,0,(struct sockadder *)&sin,sizeof(struct sockadder))==-1){
perror("\nsendto");
free(packet);
exit(1);