Linux网络编程常见面试题

概述

TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。

  • TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种。
  • UDP:用户数据报协议。UDP是一种无连接协议。UDP套接口是数据报套接口(datagram socket)的一种。

TCP与UDP简介

基本TCP客户—服务器程序设计基本框架

TCP流程

基本UDP客户—服务器程序设计基本框架

UDP流程

UDP和TCP的对比

  • TCP面向连接(三次握手机制),通信前需要先建立连接;UDP面向无连接,通信前不需要建立连接;
  • TCP保障可靠传输(按序、无差错、不丢失、不重复、超时重发); UDP不保障可靠传输,使用最大努力交付;
  • TCP面向字节流的传输,UDP面向数据报的传输。

TCP优缺点:

  • 优点:
    1.TCP提供以认可的方式显式地创建和终止连接。
    2.TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
    3.TCP处理流控制。
    4.允许数据优先
    5.如果数据没有传送到,则TCP套接口返回一个出错状态条件。
    6.TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道

  • 缺点: TCP在转移数据时必须创建(并保持)一个连接。这个连接给通信进程增加了开销,让它比UDP速度要慢。

UDP优缺点:

1.UDP不要求保持一个连接
2.UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。
3.设计UDP的目的是用于短应用和控制消息
4.在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TDP更小。

TCP/IP应用编程接口(API)

  • TCP服务端:
  • TCP客户端:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>#define PORT  2345
#define DSET_IP_ADDRESS "192.168.218.141"int main(int argc, char *argv[]) 
{int sockfd;char buffer[1024];struct sockaddr_in server_addr;sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sockfd == -1) {perror("socket error");exit(EXIT_FAILURE);  } bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT); server_addr.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {   perror("connect error.");exit(EXIT_FAILURE);}do {printf("Please input char:\n"); fgets(buffer,1024,stdin);write(sockfd,buffer,strlen(buffer));} while (strncmp(buffer, "quit", 4) != 0);close(sockfd);exit(EXIT_SUCCESS); 
}
  • UDP服务端:
 #include<stdio.h> # include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#include<errno.h>#include<string.h>#include<stdlib.h>#define SERV_PORT   3000int main(int argc, char *argv[])
{int sock_fd;   //套接子描述符号int recv_num;int send_num;int client_len;char recv_buf[20];struct sockaddr_in  addr_serv;struct sockaddr_in  addr_client;//服务器和客户端地址sock_fd = socket(AF_INET,SOCK_DGRAM,0);if(sock_fd < 0){perror("socket");exit(1);} else {printf("sock sucessful\n");}//初始化服务器断地址memset(&addr_serv,0,sizeof(struct sockaddr_in));addr_serv.sin_family = AF_INET;//协议族addr_serv.sin_port = htons(SERV_PORT);addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);//任意本地址client_len = sizeof(struct sockaddr_in);/*绑定套接子*/if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0 ){perror("bind");exit(1);} else{printf("bind sucess\n");}while(1){printf("begin recv:\n");recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_client,&client_len);if(recv_num <  0){printf("bad\n");perror("again recvfrom");exit(1);} else{recv_buf[recv_num]='\0';printf("recv sucess:%s\n",recv_buf);}printf("begin send:\n");send_num = sendto(sock_fd,recv_buf,recv_num,0,(struct sockaddr *)&addr_client,client_len);if(send_num < 0){perror("sendto");exit(1);} else{printf("send sucessful\n");}}close(sock_fd);return 0;
}
  • UDP客户端:
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>#define DEST_PORT 3000
#define DSET_IP_ADDRESS  "192.168.1.103"int main(int argc, char *argv[])
{int sock_fd;/*套接字文件描述符*/int send_num;int recv_num;int dest_len;char send_buf[20]={"hello tiger"};char recv_buf[20];struct sockaddr_in addr_serv;/*服务端地址,客户端地址*/sock_fd = socket(AF_INET,SOCK_DGRAM,0);//创建套接子//初始化服务器端地址memset(&addr_serv,0,sizeof(addr_serv));addr_serv.sin_family = AF_INET;addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);addr_serv.sin_port = htons(DEST_PORT);dest_len = sizeof(struct sockaddr_in);printf("begin send:\n");send_num = sendto(sock_fd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&addr_serv,dest_len);if(send_num < 0){perror("sendto");exit(1);} else{printf("send sucessful:%s\n",send_buf);}recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_serv,&dest_len);if(recv_num <0 ){perror("recv_from");exit(1);} else{printf("recv sucessful\n");recv_buf[recv_num]='\0';printf("the receive:%s\n",recv_buf);}close(sock_fd);return 0;
}

参考:

  • 基于Socket的UDP和TCP编程介绍
  • TCP字节流与UDP数据报
  • 网络面试试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sizeof与offsetof有关的结构体详解

sizeof与offsetof在程序中经常遇到&#xff0c;但在面试中其应用使得许多小伙伴吃闭门羹&#xff0c;被面试官问得哑口无言。接下来对两者的应用做详细介绍。 关于sizeof 定义 sizeof乃C/C中的一个操作符(operator), 简单的说其作用就是返回一个对象或者类型所占的内存字节数…

linux线程间同步(1)读写锁

读写锁比mutex有更高的适用性&#xff0c;可以多个线程同时占用读模式的读写锁&#xff0c;但是只能一个线程占用写模式的读写锁。 1. 当读写锁是写加锁状态时&#xff0c;在这个锁被解锁之前&#xff0c;所有试图对这个锁加锁的线程都会被阻塞&#xff1b; 2. 当读写锁在读加…

linux线程间同步(1)互斥锁与条件变量

线程的最大特点是资源的共享性&#xff0c;但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步&#xff0c;最常用的是互斥锁、条件变量和信号量以及读写锁。 互斥锁(mutex) 互斥锁&#xff0c;是一种信号量&#xff0c;常用来防止两个进程或线…

Linux下压缩包生成与解压命令以及进度

不同后缀压缩包的打包与加压命令 .tar 解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName .gz 解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d FileName.gz压缩&#xff1a;gzip FileName .tar.gz 和 .tgz 解压&#xff1a;…

经典面试题

谷歌面试题&#xff1a;1024! 末尾有多少个0&#xff1f; 末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数&#xff0c;所以我们只需统计因子5的个数。 是5的倍数的数有&#xff1a; 1024 / 5 204个;对于25,50这些数据统计一次,但实际的是包含两个…

共享内存:mmap函数实现

内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;将特殊文件进行匿名内存映射&#xff0c;可以为关联进程提供共享内存空间;为无关联的进程提供共享内存空间&#xff0c;一般也是将…

MSYS2开发环境搭建

MSYS2开发环境搭建 软件安装 下载msys2-x86_64软件包 https://www.msys2.org/&#xff0c;双击安装到某根目录下&#xff0c;比如D:\msys64。 pacman是MSYS2自带的软件管理工具&#xff1a; 可通过修改msys64\etc\pacman.d下的三个文件修改软件源&#xff0c;可供选择的源有…

设置python路径

在python开发应用&#xff0c;我们多数是通过pip、easy_install等工具将需要的python安装到自己机子上就可以应用了&#xff0c;但是我们完成开发给用户使用时&#xff0c;程序运行环境就是一个问题。当然&#xff0c;你可以要求客户按照你的方法安装依赖的库&#xff0c;这种方…

linux动态库查找路径以及依赖关系梳理

编译时与运行时库的路径 linux下&#xff0c;编译时与运行时库的搜索路径是不同的 运行时动态库的路径搜索顺序 LD_PRELOAD环境变量&#xff0c;一般用于hack 编译目标代码时指定的动态库搜索路径(指的是用 -wl,rpath 或-R选项而不是-L)&#xff0c;readelf -d命令可以查看编…

eclipse--android开发环境搭建教程

引言 在windows安装Android的开发环境不简单也说不上算复杂&#xff0c;但由于国内无法正常访问google给android开发环境搭建带来不小的麻烦。现将本人搭建过程记录如下&#xff0c;希望会对投身android开发的小伙伴有所帮助。 android开发环境部署过程 安装JDK环境 下载安装…

pip工具使用总结以及常用库PIL、freetype的安装

pip工具安装使用 pip为python库软件管理工具pip docs 安装 wget https://bootstrap.pypa.io/ez_setup.py -O - | python 安装setuptools https://pypi.python.org/pypi/setuptoolswget https://bootstrap.pypa.io/get-pip.py -O - | python 安装pip工具 ttps://pypi.python.…

【技巧】Chrome应用技巧

把Chrome浏览器变成文本编辑器 在浏览器地址栏中输入一行代码&#xff1a;data:text/html, <html contenteditable>&#xff0c;回车即可把浏览器变临时编辑器。【CtrlShiftJ】调出JavaScript控制台&#xff0c;在控制台输入&#xff1a; document.body.contentEditable…

eclipse--python开发环境搭建

pydev插件介绍 PyDev is a Python IDE for Eclipse pydev官方网站&#xff1a;http://www.pydev.org/ 在Eclipse中安装pydev插件 启动Eclipse, 点击Help->Install New Software… 在弹出的对话框中&#xff0c;点Add 按钮。 Name中填:Pydev, Location中填http://pydev.or…

Win7虚拟无线AP以及Android手机抓包

设备要求 Windows7操作系统装有无线网卡的笔记本或台式机无线网卡必须支持“承载网络” 查看无线网卡是否支持“承载” 方法一: 开始菜单→所有程序→附件→命令提示符→右键“以管理员权限运行”; 键入命令“netsh wlan show drivers”,查看“支持承载网络”这一项,如果是…

CMD命令之BAT脚本路径信息

CD命令解疑 cd是chdir的缩写&#xff0c;命令详解参见cd /? 可以看到/d参数的解释如下&#xff1a; 使用 /D命令行开关&#xff0c;除了改变驱动器的当前目录之外&#xff0c;还可改变当前驱动器。 通常我们在xp系统中打开cmd窗口时&#xff0c;会显示 C:\Documents and Se…

Ubuntu开发环境搭建

在虚拟中试玩Ubuntu1604版本&#xff0c;有关安装后一些配置记录如下&#xff0c;以备后用。 简单设置 root密码设置 虚拟机安装完成后&#xff0c;默认不弃用root用户&#xff0c;需要给root设置密码后使用 sudo passwd root终端加入右键中 将终端加入右键后&#xff0c;在某…

Python GUI Programming (Tkinter)

Tkinter编程实例 #!/usr/bin/python #coding:utf-8from Tkinter import * import sysreload(sys) sys.setdefaultencoding(utf-8)class GUI_WINDOWS:def __init__(self, root):self.root Frame(root)self.driver Noneself.friendEdit Noneself.bStopQuery Falseself.loadF…

【ubuntu 22.04】安装vscode并配置正常访问应用商店

注意&#xff1a;要去vscode官网下载deb安装包&#xff0c;在软件商店下载的版本不支持输入中文 在ubuntu下用火狐浏览器无法访问vscode官网&#xff0c;此时可以手动进行DNS解析&#xff0c;打开DNS在线查询工具&#xff0c;解析以下主机地址&#xff08;复制最后一个IP地址&a…

Appium安装使用总结

开发环境搭建 搭建java JDK与Android SDK环境下载安装nodejs下载安装Appium 问题答疑 在测试中adb devices查询无缘无故多出陌生的虚拟设备 同事的经验是重启电脑&#xff0c;莫名其妙的设备消失&#xff1b;自我总结就是重启adb服务&#xff0c;adb kill-server&#xff0…

Python使用笔记总结目录

从2012年接触python&#xff0c;陆陆续续使用python将近3年。从最开始的使用python进行xml解析&#xff0c;到使用python做爬虫开发&#xff0c;再到最近半年的使用深度学习进行图像识别&#xff0c;python简洁易用&#xff0c;丰富的资源库&#xff0c;活跃的社区&#xff0c;…