国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-14 11:38:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

#Socket簡(jiǎn)介

是一個(gè)編程接口是一種特殊的文件描述符(everything in Unix is a file)并不僅限于TCPip協(xié)議面向連接(Transmission Control PRotocol - TCPIP)無(wú)連接(User Datagram Protocol-UDP 和 Inter-Network Packet Exchange-IPX)

#Socket類型流式套接字(SOCK_STREAM)提供了一個(gè)面向連接,可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò),無(wú)重復(fù)的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒(méi)慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)提供無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)送,不提供無(wú)差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收原始套接字(SOCK_RAW)可以對(duì)較低層次協(xié)議如IP,ICMP直接訪問(wèn)

#IP地址IP地址是Internet中主機(jī)的標(biāo)識(shí)Internet中的主機(jī)要與別的機(jī)器通信必須具有一個(gè)IP地址IP地址為32位(IPV4)或者128位(IPV6)每個(gè)數(shù)據(jù)包都必須攜帶目的IP地址和源IP地址,路由器依靠此信息為數(shù)據(jù)包選擇路由表示形式:常用點(diǎn)分形式,如202.38.64.10,最后都會(huì)轉(zhuǎn)換為一個(gè)32位的無(wú)符號(hào)整數(shù)。

#IP地址的轉(zhuǎn)換inet_aton()將strptr所指的字符串轉(zhuǎn)換成32位的網(wǎng)絡(luò)字節(jié)序二進(jìn)制值int inet_aton(const char *strptr, struct in_addr *addrptr);inet_addr()功能同上,返回轉(zhuǎn)換后的地址in_addr_t inet_addr(const char *strptr);inet_ntoa()將32位網(wǎng)絡(luò)字節(jié)序二進(jìn)制地址轉(zhuǎn)換成點(diǎn)分十進(jìn)制的字符串。char *inet_ntoa(struct in_addr inaddr);

#端口號(hào)為了區(qū)分一臺(tái)主機(jī)接收到的數(shù)據(jù)包應(yīng)該轉(zhuǎn)交給哪個(gè)進(jìn)程來(lái)進(jìn)行處理,使用端口號(hào)來(lái)區(qū)分TCP端口號(hào)與UDP端口號(hào)獨(dú)立(協(xié)議不同可以使用同一個(gè)端口)三無(wú)組:協(xié)議,IP,端口端口號(hào)一般由IANA(Internet Assigned Numbers Authority)管理眾所周知端口:1~1023(1~255之間為眾所周知端口,256~1023端口通常由UNIX系統(tǒng)占用已登記端口:1024~49151動(dòng)態(tài)或私有端口:49152~65535

#字節(jié)序不同類型CPU的主機(jī)中,內(nèi)存存儲(chǔ)多字節(jié)整數(shù)序列有兩種方法,稱為主機(jī)字節(jié)序(HBO):小端序(little-endian)-低字節(jié)存儲(chǔ)在低地址將低字節(jié)存儲(chǔ)在起始地址,稱為"Little-Endian"字節(jié)序,Intel,AMD等采用的是這種方式大端序(big-endian)-高序字節(jié)存儲(chǔ)在低地址將高字節(jié)存儲(chǔ)在起始地址,稱為"Big-Endian"字節(jié)序,由ARM,Motorola等所采用網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)必須按網(wǎng)絡(luò)字節(jié)序,即大端字節(jié)序在大部分PC機(jī)上,當(dāng)應(yīng)用進(jìn)程將整數(shù)送入socket前,需要轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)序;當(dāng)應(yīng)用進(jìn)程從socket取出整數(shù)后,要轉(zhuǎn)化成小端字節(jié)序

#字節(jié)序轉(zhuǎn)換函數(shù)把給定系統(tǒng)所采用的字節(jié)序稱為主機(jī)字節(jié)序,為了避免不同類別主機(jī)之間在數(shù)據(jù)交換時(shí)由于對(duì)于字節(jié)序的不用而導(dǎo)致的差錯(cuò),引入了網(wǎng)絡(luò)字節(jié)序主機(jī)字節(jié)序到網(wǎng)絡(luò)字節(jié)序:u_long htonl(u_long hostlong);u_short htons(u_short short);網(wǎng)絡(luò)字節(jié)序到主機(jī)字節(jié)序u_long ntohl(u_long hostlong);u_short ntohs(u_short short);

#網(wǎng)絡(luò)編程相關(guān)APIint Socket(int domain, int type, int protocol);int bind(int Sockfd, struct sockaddr *my_addr, int addrlen);int listen(int sockfd, in backlog);int accept(int sockfd, struct sockaddr *addr, Socklen_t *addrlen);int connect(int sockfd, const struct sockaddr *addr, Socklen_t addrlen);ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,        const struct sockaddr *dest_addr, Socklen_t addrlen);ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,        struct sockaddr *src_addr, Socklen_t *addrlen);int shutdown(int sockfd, int how);

#command:netstat -anpt

#地址結(jié)構(gòu)的一般用法1.定義一個(gè)struct sockaddr_in類型的變量并清空struct sockaddr_in myaddr;memset(&myaddr, 0, sizeof(myaddr));2.填充地址信息myaddr.sin_family = PF_INET;myaddr.sin_port = htons(8888);myaddr.sin_addr.s_addr = inet_addr("192.168.1.100");3.將該變量強(qiáng)制轉(zhuǎn)換為struct sockaddr類型在函數(shù)中使用bind(listenfd,(struct sockaddr *)&myaddr, sizeof(myaddr));

#地址轉(zhuǎn)換函數(shù)unsigned long inet_addr(const char *address);int inet_aton(const char *cp, struct in_addr *inp);char *inet_ntoa(struct in_addr in);

socket流程圖:

 

 

附:代碼

client.c

//int socket(int domain, int type, int protocol);//int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//int listen(int sockfd, int backlog);//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//uint16_t htons(uint16_t hostshort);//int atoi(const char *nptr);//in_addr_t inet_addr(const char *cp);//void bzero(void *s, size_t n);//int listen(int sockfd, int backlog);//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);#include <stdio.h>#include <sys/types.h>//socket():bind();listen():accept();listen();accept();connect();#include <sys/socket.h>//socket():bind();listen():accept();inet_addr();listen():accept();connect();#include <arpa/inet.h>//htons();inet_addr():#include <netinet/in.h>//inet_addr():#include <strings.h>//bzero();#include <stdlib.h>//atoi();exit();#include <unistd.h>//close():#include <string.h>#define N 64int main(int argc, char *argv[]){    if(argc < 3)    {        printf("Using: %s ip port/n",argv[0]);        exit(-1);    }    int sockfd;    struct sockaddr_in myaddr,peeraddr;    char buf[N] = {0};    size_t n;    socklen_t mylen,peerlen;    mylen = sizeof(myaddr);    peerlen = sizeof(peeraddr);    /*  creat socket  */    if(-1 == (sockfd = socket(AF_INET,SOCK_DGRAM,0)))    {        perror("socket");        exit(-1);    }    /* bind initialization */    bzero(&myaddr,sizeof(myaddr));    myaddr.sin_family = AF_INET;    myaddr.sin_port = htons(atoi(argv[2])+1);    myaddr.sin_addr.s_addr = inet_addr(argv[1]);    /*      bind      */    if(-1 == bind(sockfd, (struct sockaddr *)&myaddr, mylen))    {        perror("bind");        exit(-1);    }    /*    connect    */    bzero(&peeraddr, sizeof(peeraddr));    peeraddr.sin_family = AF_INET;    peeraddr.sin_port = htons(atoi(argv[2]));    peeraddr.sin_addr.s_addr = inet_addr(argv[1]);    //connect(sockfd,(struct sockaddr *)&peeraddr, peerlen);    while(1){    fgets(buf, N, stdin);    printf("buf:%s",buf);    if(-1 == (n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&peeraddr, peerlen)))    {        perror("sendto");        exit(-1);    }    if(strncmp(buf, "quit", 4) == 0)            break;    printf("n = %d/n",n);    }    close(sockfd);    exit(0);}復(fù)制代碼server.c復(fù)制代碼#include <stdio.h>#include <sys/types.h>//socket():bind();listen():accept();listen();accept();connect();#include <sys/socket.h>//socket():bind();listen():accept();inet_addr();listen():accept();connect();#include <arpa/inet.h>//htons();inet_addr():#include <netinet/in.h>//inet_addr():#include <strings.h>//bzero();#include <stdlib.h>//atoi();exit();#include <unistd.h>//close():#include <string.h>#define N 64typedef struct sockaddr SA;int main(int argc, char *argv[]){    if(argc < 3)    {        printf("Using: %s ip port/n",argv[0]);        exit(-1);    }    int listenfd, connfd;    struct sockaddr_in myaddr, peeraddr;    char buf[N] = {0};    size_t n;    socklen_t mylen, peerlen;    mylen = sizeof(myaddr);    peerlen = sizeof(peeraddr);    /*    create    socket    */    if ((listenfd = (socket(PF_INET, SOCK_DGRAM, 0))) < 0)    {        perror("socket");        exit(-1);    }    /*    bind initialization    */    bzero(&myaddr, mylen);    myaddr.sin_family = PF_INET;    myaddr.sin_port = htons(atoi(argv[2]));    inet_aton(argv[1], &myaddr.sin_addr);        if(bind(listenfd,(SA *)&myaddr, sizeof(myaddr)) < 0)    {        perror("bind");        exit(-1);    }    /*    listen        */    listen(listenfd, 5);    /*    accept        */    if(-1 == (connfd = accept(listenfd, (SA *)&peeraddr, &peerlen)))    {        perror("accept");        exit(-1);    }    printf("connect from %s: %d/n",inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));    /*    recv-send    */    while(1){    n = recv(connfd, buf, N, 0);    buf[n] = 0;    printf("n = %d---%s/n",n,buf);    if(0 == strncmp(buf,"quit",4))    break;    send(connfd, buf, strlen(buf), 0);    }    close(connfd);    close(listenfd);    exit(0);}

原文鏈接:http://m.survivalescaperooms.com/lr-ting/archive/2012/08/24/2652482.html


上一篇:P1086 花生采摘

下一篇:C結(jié)構(gòu)體

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜阳县| 丘北县| 定陶县| 姜堰市| 什邡市| 六安市| 长寿区| 侯马市| 盐池县| 怀宁县| 瑞安市| 泽库县| 邛崃市| 通化县| 子长县| 高州市| 普兰店市| 墨玉县| 泰宁县| 大理市| 巨野县| 罗甸县| 汉寿县| 辉县市| 邵武市| 陇南市| 洱源县| 古丈县| 冕宁县| 溧阳市| 集贤县| 保定市| 康马县| 桂东县| 肇东市| 彰化县| 虎林市| 塘沽区| 静乐县| 安新县| 张家界市|