1>TCP
源代码:
服务器端:
#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int sfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);bind(sfd, (struct sockaddr *)&sin, sizeof(sin));listen(sfd, 128);struct sockaddr_in cin;socklen_t socklen = sizeof(cin);int newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);printf("客户端IP:%s, 端口号为:%d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));int res = recv(newfd, rbuf, sizeof(rbuf),0);if (res == 0){printf("客户端已经关闭\n");break;}printf("从IP为%s 端口为%d 接收到数据为:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);strcat(rbuf, "O.o");send(newfd, rbuf, strlen(rbuf),MSG_DONTWAIT);}close(newfd);close(sfd);return 0;
}
客户端:
#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int cfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);connect(cfd, (struct sockaddr *)&sin, sizeof(sin));char wbuf[MAXSIZE] = "";while (1){bzero(wbuf, sizeof(wbuf));printf("请输入>>>\n");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;send(cfd, wbuf, strlen(wbuf), 0);printf("send success\n");if (strcmp(wbuf, "quit") == 0){break;}bzero(wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到消息为:%s\n", wbuf);}close(cfd);return 0;
}
效果图
2>UDP
源代码:
服务器端
#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int sfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);bind(sfd, (struct sockaddr *)&sin, sizeof(sin));char rbuf[MAXSIZE] = "";struct sockaddr_in cin;socklen_t socklen = sizeof(cin);while (1){bzero(rbuf, sizeof(rbuf));recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&cin, &socklen);printf("接受到的消息为:%s\n", rbuf);strcat(rbuf, "o.O");sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr *)&cin,socklen);printf("发送成功\n");}close(sfd);return 0;
}
客户端:
#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int cfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);char wbuf[MAXSIZE] = "";while (1){bzero(wbuf, sizeof(wbuf));printf("请输入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1] = 0;sendto(cfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&sin, sizeof(sin));printf("发送成功\n");bzero(wbuf,sizeof(wbuf));recvfrom(cfd, wbuf, sizeof(wbuf), 0, NULL,NULL);printf("接受到的消息为:%s\n", wbuf);}close(cfd);return 0;
}
效果图:
3>思维导图
4>面试题整理
1.标准IO的实现
通过操作句柄FILE*类型的指针,使用fopen、fclose、fgets等函数来操作文件。在操作过程中,有一个缓冲区,先将要输入或输出的数据,放入缓冲区后,等到缓冲区刷新时机到了后,统一调用内核提供的函数,将数据刷入内核空间,经由内核空间做后续操作。
2.什么是进程?
进程是程序的一次执行过程,是资源分配的基本单位,每个进程会被分配4Gd的虚拟内存,调度机制为:时间片轮询、上下文切换,有一定的生命周期:创建态-->就绪态-->阻塞态-->运行态-->终止态
3.如何将程序执行直接运行于后台?
a.out 后加 &
4.共享内存通信原理
是多个进程之间的通信,共享内存是将独立于多个进程之外的物理内存,分别映射到不同的进程中,其中一个进程对其进行修改,另一个进程也跟着修改;共享内存中的数据的读写不是一次性的,写入共享内存中的数据,被读取后,依然存在,直到下一次写入的数据将其覆盖;共享内存的操作时,由于共享内存段,相对于多个进程属于临界资源,所以对该资源的使用,需要使用同步机制
5.TCP/IP四层网络通信结构?
网络接口层-->网际层-->运输层-->应用层
6.TCP服务器通信流程
创建套接字-->绑定服务器地址信息结构体-->设置被动监听-->阻塞等待客户端的连接-->数据收发-->关闭套接字
7.路由器位于哪一层?
网际层
8.交换机在哪一层?
网络接口层
9.static的用法
作用:static静态变量
1.static修饰的变量内存在静态区
2.static修饰全局变量:static修饰为初始化的全局变量默认结果为0
3.static修饰局部变量:
延长生命周期(内存的申请到释放),延长至整个文件,类似全局,不是作用域。
static修饰未初始化的局部变量,默认结果为0
4.static修饰函数:static修饰函数,生命周期在本文件有效,不可以跨文件调用
5.static修饰指针:
不可以使用staic修的指针指向auto类型的变量地址。
因为计算机先为static类型变量分配内存,后分配auto类型的变量,不允许使用已存在的变量,指向未知的变量地址。
10.const的用法
修饰的变量不可变。修饰普通变量时,相当于常量,且需要初始化;修饰函数参数时,不管是什么数据类型,也不管是 指针传递,还是 引用传递,只要加了 const 修饰,就可以防止函数内意外修改该参数,起到保护作用;用 const 修饰返回的指针或引用,保护指针或引用的内容不被修改。