如果缓冲插座已满,将采取什么措施

时间:2015-06-08 16:56:06

标签: networking udp buffer protocol-buffers

如果UDP协议中的缓冲区插槽已满,将会怎样做?它用新的数据替换旧数据吗?它只是删除新数据?

如果它与UDP协议无关,并且在代码中指定了,如何在python和C中执行此操作?

1 个答案:

答案 0 :(得分:0)

对于输出缓冲区(即一个保存要发送的数据包),import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.ArrayList; public class ElementsAdapter extends RecyclerView.Adapter<ElementsAdapter.ViewHolder> { private ArrayList<String> mDataset; private ArrayList<Integer> mDatamap; public Context context; private static final int VIEW_HEADER = 0; private static final int VIEW_NORMAL = 1; private View headerView; private int datasetSize; public class HeaderHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView headertext; public HeaderHolder(View v) { super(v); headertext = (TextView) v.findViewById(R.id.headertext); } } public class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView txtHeader; public TextView txtFooter; public ImageView imgImage; public ViewHolder(View v) { super(v); txtHeader = (TextView) v.findViewById(R.id.firstLine); txtFooter = (TextView) v.findViewById(R.id.secondLine); imgImage = (ImageView) v.findViewById(R.id.icon); } } public ElementsAdapter(ArrayList<String> myDataset, ArrayList<Integer> myDatamap) { mDataset = myDataset; myDatamap = mDatamap; } @Override public int getItemViewType(int position) { return isHeader(position) == 1 ? VIEW_HEADER : VIEW_NORMAL; } @Override public int getItemCount() { return mDataset.size(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_HEADER) { // create a new view View sub_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false); Context context = sub_view.getContext(); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(sub_view); return vh; // return new HeaderViewHolder(headerView); } else { // create a new view View sub_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sub_layout, parent, false); context = sub_view.getContext(); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(sub_view); return vh; } } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { if (isHeader(position) == 1) { // - get element from your dataset at this position // - replace the contents of the view with that element final String name = mDataset.get(position); // holder.txtHeader.setText(mDataset.get(position)); viewHolder.headertext.setText(name); } else { // - get element from your dataset at this position // - replace the contents of the view with that element final String name = mDataset.get(position); Picasso.with(context).load("http://www.500kgiveaway.co.uk/"+name).resize(200,200).into(viewHolder.imgImage); // holder.txtHeader.setText(mDataset.get(position)); viewHolder.txtHeader.setText(name); viewHolder.txtHeader.setOnClickListener(new View.OnClickListener() { @Override public void onClick (View v){ //remove(name); } } ); viewHolder.txtFooter.setText("Footer: "+mDataset.get(position)); } //ViewHolder holder = (ViewHolder) viewHolder; //holder.textView.setText("Position " + (position - 1)); } public int isHeader(int position) { return mDatamap.get(position) ==1 ? 1:0;} } 或类似的调用将阻塞,直到缓冲区中有空间可用。

对于输入缓冲区(即持有收到的数据包的缓冲区),严格来说,它取决于OS网络堆栈的实现。在Linux中,新数据包将以静默方式丢弃。在任何情况下,如果某些数据包以这种方式丢失将不会出错,因为UDP不保证它们的传输。

顺便说一句,没有&#34; UDP连接&#34;。