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 修飾返回的指針或引用,保護指針或引用的內容不被修改。