網(wǎng)絡(luò)編程基礎(chǔ)

  • 進(jìn)程的網(wǎng)絡(luò)地址:

    進(jìn)程是出于運(yùn)行過(guò)程中的程序?qū)嵗遣僮飨到y(tǒng)調(diào)度和分配的基本單位兔仰。每個(gè)進(jìn)程至少擁有一個(gè)線程否則,系統(tǒng)會(huì)自動(dòng)撤銷該進(jìn)程和它的地址空間乎赴。

  • 三種套接字:

    • 數(shù)據(jù)報(bào)套接字:無(wú)連接,不保證可靠榕吼,獨(dú)立的數(shù)據(jù)傳輸服務(wù)。
    • 流式套接字:提供雙向羹蚣、有序、無(wú)重復(fù)顽素、無(wú)邊界記錄、可靠的數(shù)據(jù)傳輸服務(wù)胁出。需要事先建立連接。
    > 面向連接的協(xié)議和面向無(wú)連接的區(qū)別在明白了這個(gè)之后變得很清楚全蝶。
    
    • 原始套接字:允許直接訪問(wèn)較低層的協(xié)議(如IP寺枉,ICMP)用與檢驗(yàn)新的協(xié)議的實(shí)現(xiàn)绷落。
  • 網(wǎng)絡(luò)協(xié)議的特征:

  1. 面向消息的協(xié)議與基于流的協(xié)議:
    • 面向消息的協(xié)議:以消息為單位在網(wǎng)上傳輸數(shù)據(jù)姥闪。一條一條的發(fā)送與接收砌烁。每條消息間都是獨(dú)立的,存在著消息邊界往弓。
    • 基于流的協(xié)議: 不保護(hù)消息的邊界,將數(shù)據(jù)拆封成字節(jié)流連續(xù)的傳輸函似,不管實(shí)際消息邊界是否存在,TCP就是基于流的協(xié)議撇寞。
  2. 面向連接和無(wú)連接的服務(wù):
    • 面向連接:每一次完整的傳輸數(shù)據(jù)都要建立連接顿天。在數(shù)據(jù)傳輸中蔑担,各數(shù)據(jù)分組不攜帶目的地址牌废,而是使用連接號(hào)啤握。本質(zhì)上講鸟缕,連接是一個(gè)管道排抬。通信前通過(guò)握手,相互傳送連接信息蹲蒲,一方面確定了通行的路徑,另一方面還可以相互協(xié)商届搁,做好通信的準(zhǔn)備,例如:準(zhǔn)備收發(fā)的緩沖區(qū)卡睦。
    • 面向無(wú)連接:類似郵政系統(tǒng)服務(wù)的抽象。每個(gè)分組都攜帶完整的目的地址么翰,各分組在系統(tǒng)中獨(dú)立傳送。無(wú)法保證分組先后到達(dá)的順序浩嫌,不進(jìn)行分組的恢復(fù)與重傳,不保證傳輸?shù)目煽啃月肽汀DP就是無(wú)連接的協(xié)議。
    • 可靠性和次序性:
      可靠性:可靠性保證了發(fā)送端發(fā)送的每一個(gè)字節(jié)都達(dá)到既定的接受端骚腥,保證數(shù)據(jù)的完整性。
      次序性:保證收到的數(shù)據(jù)的順序就是發(fā)送端發(fā)送的順序束铭。
  • P2P(對(duì)等網(wǎng)、點(diǎn)對(duì)點(diǎn))

    • P2P技術(shù):在計(jì)算機(jī)直接直接進(jìn)行資源和服務(wù)共享契沫。
    • 特征:
      1. 分散性:分布式系統(tǒng)
      2. 規(guī)模性:
      3. 擴(kuò)展性:隨時(shí)加入
      4. Servent性(sever&client)
      5. 自治性:自行加入與退出
      6. 互助性
      7. 自組織性:自行組織不需要任何管理員
  • Internet中網(wǎng)間進(jìn)程的標(biāo)識(shí)

    • 用一個(gè)三元組可以在全局中唯一的標(biāo)識(shí)一個(gè)應(yīng)用層進(jìn)程:
      1. 傳輸層協(xié)議
      2. 主機(jī)的IP地址
      3. 傳輸層的端口號(hào)

Winsock下文件傳輸:

文件傳輸
1, 注冊(cè)套接字函數(shù)socket(int af,int type,int protocol)
參數(shù)解釋:
af : 一個(gè)地址描述 ,目前只支持AF_INET格式,也就是說(shuō)在本次實(shí)驗(yàn)中此參數(shù)直接寫(xiě)
為AF_INET即可拴清。
type: 指定socket類型,例如 TCP類型(SOCK_STREAM) UDP類型(SOCK_DGRAM)

protocol: 套接口制訂協(xié)議類型 可以為0,口予。 常用類型有 IPPROTO_TCP 、IPPROTO_UDP等

2, 綁定套接字函數(shù) bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
參數(shù)解釋:
s :socket()函數(shù)返回的套接口描述字
addr : 指向Socket地址的指針
namelen :該地址的長(zhǎng)度

3沪停,監(jiān)聽(tīng)函數(shù)listen(SOCKET s,int backlog)
參數(shù)解釋:
s: socket()函數(shù)返回的套接口描述字

backlog:等待連接隊(duì)列的最大長(zhǎng)度

4,接收連接函數(shù)accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen)
參數(shù)解釋:
s: socket()函數(shù)返回的套接口描述字

addr:(可選)指針木张,指向一緩沖區(qū)窟哺,其中接收為通訊層所知的連接實(shí)體的地址技肩。addr參數(shù)的實(shí)際格式由套接口創(chuàng)建時(shí)所產(chǎn)生的地址族確定

addrlen:(可選)指針虚婿,輸入?yún)?shù)至朗,配合addr一起使用剧浸,指向存有addr地址長(zhǎng)度的整型數(shù)

5嫌变, 發(fā)送連接請(qǐng)求函數(shù)connect(SOCKET s,const struct coskaddr FAR* name,int namelen)
參數(shù)解釋:
s: socket()函數(shù)返回的套接口描述字

name: 想要進(jìn)行連接的端口名

namelen: 名字長(zhǎng)度

6,發(fā)送數(shù)據(jù)函數(shù)send( SOCKET s, const char FAR* buf, int len, int flags)
接收文件函數(shù)recv(SOCKET s, char FAR* buf, int len, int flags)
參數(shù)解釋:
s:socket()函數(shù)返回的套接口描述字
buf:用于接收數(shù)據(jù)的緩沖區(qū)
len:緩沖區(qū)長(zhǎng)度
flags:指定調(diào)用方式
7,文件操作函數(shù)fopen(const char * path,const char * mode) fclose(FILE* stream)
參數(shù)解釋:

path:欲打開(kāi)的文件路徑及文件名

mode:代表流形態(tài)

stream:文件流指針

客戶端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")

  #define MAXLINE 1024
  #define SEVERPORT 1026
  #define SEVERPORTADDR "192.168.1.110"

  int main () 
  {
WSADATA wsaData;//wsdate 用于存儲(chǔ)調(diào)用windock中socket初始化函數(shù)返回的初始化信息 
WORD socketVersion = MAKEWORD(2.2); //就是一個(gè)word地位用來(lái)指明主版本號(hào)东涡,高位用來(lái)指明修正號(hào)
//初始化windows socket
if (0 != WSAStratup(socketVersion,&wsaData)) {
    printf("初始化失敗凸舵!\n");
    exit(0);
}
char recvbuff[MAXLINE + 1]; //創(chuàng)建緩沖區(qū)
int sockfd,n;//socket標(biāo)志字,那么fd是什么意思呢贿条,fd是file descriptor的縮寫(xiě)整以。顧名思義就是文件描述符啦峻仇。
//設(shè)置地址
struct sockaddr_in servaddr;
//給地址初始化
memset(&servaddr,0,sizeof(servaddr));
//設(shè)置使用IPV4通信
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SEVERPORT);//host to network short int;
//sin_addr中的聯(lián)合S_un包含的s_un.s_addr 意思為An IPv4 address formatted as a u_long
servaddr.sin_addr.S_un.S_addr = inet_addr(SEVERPORTADDR);
//生成套接字
if ((sockfd  = socket(AF_INET,SOCK_STREAM.0)) < 0) {
    printf("sockfd error!\n");
    exit(0);
}

//嘗試連接服務(wù)器
printf("請(qǐng)輸入要傳輸?shù)奈募n");

char filename[256];
scanf("%s",filename);

//建立文件緩沖區(qū)凡蚜,定義文件指針,指向傳輸文件
FILE * fp = (FILE *)NULL;//初始化文件指針

fp = fopen(filename,"rb"); //用二進(jìn)制格式打開(kāi)一個(gè)文件谱醇,只允許讀副渴。


if (fp == (FILE *)NULL) {
    printf("打開(kāi)文件失斨缶纭勉盅!\n");
    return 0;
}

//發(fā)送文件名
n = send(sockfd, filename, strlen(filename), 0);
//如果無(wú)錯(cuò)誤漩符,返回值為發(fā)送數(shù)據(jù)的總數(shù)
printf("發(fā)送數(shù)據(jù)為:%d\n",n);

//接受服務(wù)器返回的信息
 n = recv(sockfd,recvbuff,MAXLINE,0);
 
if(strcmp(recvbuff,  "ok") == 0){//如果服務(wù)器返回ok則開(kāi)始傳送文件
    memset(recvbuff, 0, sizeof(recvbuff));
    while(!feof(fp)){
        n = fread(recvbuff, sizeof(char), 1000, fp);
        printf("%d\n", n);
        n = send(sockfd, recvbuff, n, 0);
        printf("send n = %d\n", n);
    }//傳送文件
    fclose(fp);//關(guān)閉文件
}
closesocket(sockfd);
//關(guān)閉網(wǎng)絡(luò)描述符
return 0;
  }

服務(wù)器
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<WinSock2.h>

  #define PORTNUMBER 3333 //定義端口號(hào)
  #define MAXLINE           1024 //緩存大小
  #pragma comment(lib,"ws2_32.lib")

  #define QueueLen 1

  char buffer[MAXLINE+1];
  int n;
  int  main(int argc, char * argv[])
  {
WORD version;
version = MAKEWORD(1, 1);
WSADATA wsa;
if(0 != WSAStartup(version, &wsa)){ 
            printf("WSAStartup error!\n");
          exit(0);
      }//初始化 socket

struct sockaddr_in servaddr; //服務(wù)器IP地址
struct sockaddr_in clientaddr;//客戶端IP地址
int listenfd;//監(jiān)聽(tīng)的網(wǎng)絡(luò)描述符
int clientfd;//客戶端網(wǎng)絡(luò)描述符
int alen;

memset(&servaddr, 0, sizeof(servaddr)); //初始化

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY; //INADDR_ANY 你網(wǎng)卡上的任意IP凸克,比如你有多個(gè)IP
servaddr.sin_port = htons((unsigned short) PORTNUMBER); 
//初始化服務(wù)器

listenfd =  socket(AF_INET, SOCK_STREAM, IPPROTO_IP ); 
//初始化監(jiān)聽(tīng)的網(wǎng)絡(luò)描述符
if(listenfd< 0){
    fprintf(stderr, "socket createion failed!\n");
    exit(0);
}//失敗
if(bind(listenfd, (struct  sockaddr *) &servaddr, sizeof(servaddr)) < 0){
    fprintf(stderr, "bind failed!\n");
    exit(0);
}//版定到端口
if(listen(listenfd, QueueLen) < 0){
    fprintf(stderr, "listen failed!\n");
    exit(0);
}//綁定失敗
char filename[256];
while(1){
    alen = sizeof(clientaddr);
    if((clientfd = accept(listenfd, (struct sockaddr*)&clientaddr, &alen)) < 0){
        fprintf(stderr, "accept failed!\n");
        exit(0);
    }//接受客戶端的連接
    n = recv(clientfd, filename, 255, 0);//接受客戶端發(fā)送的信息
    filename[n] = '\0';
    printf("recv n = %d\n", n);
    FILE * fp = (FILE *)NULL;
    if((FILE *) NULL == (fp = fopen(filename, "wb"))){
        printf("open file %s failed!\n", filename);
        return 0;
    }
    n = send(clientfd, "ok", strlen("ok"), 0);
    //發(fā)送 ok 到客戶端,讓客戶端開(kāi)始發(fā)送文件
    printf("send n = %d\n", n);
    while(n = recv(clientfd, buffer, 1000, 0)){
        printf("recv n = %d\n", n);
        fwrite(buffer, sizeof(char), n, fp);
        if(n != 1000)
            break;
    }//接受文件并保存
    fclose(fp);
    closesocket(clientfd);
    //關(guān)閉文件戳粒,關(guān)閉網(wǎng)絡(luò)描述符
}
return 0;
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苹祟,隨后出現(xiàn)的幾起案子评雌,更是在濱河造成了極大的恐慌景东,老刑警劉巖斤吐,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曲初,死亡現(xiàn)場(chǎng)離奇詭異臼婆,居然都是意外死亡颁褂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贮聂,“玉大人吓懈,你說(shuō)我怎么就攤上這事〉榕拢” “怎么了温兼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵妨托,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敦腔,道長(zhǎng)符衔,這世上最難降的妖魔是什么判族? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辩撑,結(jié)果婚禮上各薇,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布砌滞。 她就那樣靜靜地躺著坏怪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铝宵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天鹏秋,我揣著相機(jī)與錄音,去河邊找鬼侣夷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛百拓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衙传,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蓖捶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穿香,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后皮获,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洒宝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雁歌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靠瞎,死狀恐怖求妹,靈堂內(nèi)的尸體忽然破棺而出乏盐,到底是詐尸還是另有隱情制恍,我是刑警寧澤父能,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布净神,位于F島的核電站,受9級(jí)特大地震影響鹃唯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俯渤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望八匠。 院中可真熱鬧,春花似錦梨树、人聲如沸坑夯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隶垮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狸吞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蹋偏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人至壤。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黎棠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葫掉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.1 網(wǎng)絡(luò)常識(shí) 1)網(wǎng)絡(luò)的7層網(wǎng)絡(luò)協(xié)議 ISO按照邏輯劃分出來(lái)7層網(wǎng)絡(luò)協(xié)議 應(yīng)用層:和應(yīng)用程序打交道的跟狱,進(jìn)行數(shù)據(jù)...
    vera姐姐閱讀 479評(píng)論 0 1
  • 網(wǎng)絡(luò)編程基礎(chǔ)1 URL url(統(tǒng)一資源定位符 Uniform Resourse Locator)通過(guò)一個(gè)URl户魏,...
    董軍1990閱讀 7,400評(píng)論 8 45
  • #Socket簡(jiǎn)介 是一個(gè)編程接口 是一種特殊的文件描述符(everything in Unix is a fil...
    我替上帝收尸閱讀 1,993評(píng)論 0 1
  • 一、Socket簡(jiǎn)介Socket是進(jìn)程通訊的一種方式叼丑,即調(diào)用這個(gè)網(wǎng)絡(luò)庫(kù)的一些API函數(shù)實(shí)現(xiàn)分布在不同主機(jī)的相關(guān)進(jìn)程...
    小吖朱閱讀 331評(píng)論 0 1
  • 眾得處分,退而遞相謂曰:我等眾人鸠信,不須澄心用意作偈纵寝,將呈和尚有何所益星立?神秀上座現(xiàn)為教授師爽茴,必是他得绰垂。我輩謾作...
    回歸當(dāng)初閱讀 1,090評(píng)論 0 0