日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

socket(套接字)详解一种通讯机制

發(fā)布時(shí)間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket(套接字)详解一种通讯机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

socket給提供給使用進(jìn)程TCP/UDP等網(wǎng)絡(luò)協(xié)議進(jìn)行網(wǎng)絡(luò)通訊手段。
linux中網(wǎng)絡(luò)編程通過socket接口實(shí)現(xiàn);
socket既是一種特殊的IO,提供對(duì)應(yīng)的文件描述符。socket都有一個(gè)相關(guān)的描述{協(xié)議,本地地址,本地端口,遠(yuǎn)程地址,遠(yuǎn)程端口}(五元組信息);每一個(gè)socket有一個(gè)本地的唯一socket,由操作系統(tǒng)分配。

#include <sys/socket.h>int socket(int domain, int type, int protocol) 返回:成功返回描述符,出錯(cuò)返回-1
socket說到底就是一個(gè)結(jié)構(gòu)體

socket創(chuàng)建在內(nèi)核中,若創(chuàng)建成功返回文件描述表中的socket描述符;
使用socket內(nèi)核調(diào)用,創(chuàng)建結(jié)構(gòu)體;

socket函數(shù)對(duì)應(yīng)于普通文件的打開操作。普通文件的打開操作返回一個(gè)文件描述字,而socket()用于創(chuàng)建一個(gè)socket描述符(socket descriptor),它唯一標(biāo)識(shí)一個(gè)socket。這個(gè)socket描述字跟文件描述字一樣,后續(xù)的操作都有用到它,把它作為參數(shù),通過它來進(jìn)行一些讀寫操作。

正如可以給fopen的傳入不同參數(shù)值,以打開不同的文件。創(chuàng)建socket的時(shí)候,也可以指定不同的參數(shù)創(chuàng)建不同的socket描述符,socket函數(shù)的三個(gè)參數(shù)分別為:

domain:即協(xié)議域,又稱為協(xié)議族(family)。常用的協(xié)議族有,AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或稱AF_UNIX,Unix域socket)、AF_ROUTE等等。協(xié)議族決定了socket的地址類型,在通信中必須采用對(duì)應(yīng)的地址,如AF_INET決定了要用ipv4地址(32位的)與端口號(hào)(16位的)的組合、AF_UNIX決定了要用一個(gè)絕對(duì)路徑名作為地址。
type:指定socket類型。常用的socket類型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等
protocol:就是指定協(xié)議。常用的協(xié)議有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它們分別對(duì)應(yīng)TCP傳輸協(xié)議、UDP傳輸協(xié)議、STCP傳輸協(xié)議、TIPC傳輸協(xié)議。protocol一般取為0,表示給定的域和套接字類型類型選擇默認(rèn)協(xié)議;

注意:并不是上面的type和protocol可以隨意組合的,如SOCK_STREAM不可以跟IPPROTO_UDP組合。當(dāng)protocol為0時(shí),會(huì)自動(dòng)選擇type類型對(duì)應(yīng)的默認(rèn)協(xié)議。

Socket編程實(shí)例

服務(wù)器端:一直監(jiān)聽本機(jī)的8000號(hào)端口,如果收到連接請(qǐng)求,將接收請(qǐng)求并接收客戶端發(fā)來的消息,并向客戶端返回消息

/* File Name: server.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEFAULT_PORT 8000 #define MAXLINE 4096 int main(int argc, char** argv) { int socket_fd, connect_fd; struct sockaddr_in servaddr; char buff[4096]; int n; //初始化Socket if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //初始化 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址設(shè)置成INADDR_ANY,讓系統(tǒng)自動(dòng)獲取本機(jī)的IP地址。 servaddr.sin_port = htons(DEFAULT_PORT);//設(shè)置的端口為DEFAULT_PORT //將本地地址綁定到所創(chuàng)建的套接字上 if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //開始監(jiān)聽是否有客戶端連接 if( listen(socket_fd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1){ //阻塞直到有客戶端連接,不然多浪費(fèi)CPU資源。 if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } //接受客戶端傳過來的數(shù)據(jù) n = recv(connect_fd, buff, MAXLINE, 0); //向客戶端發(fā)送回應(yīng)數(shù)據(jù) if(!fork()){ /*紫禁城*/ if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1) perror("send error"); close(connect_fd); exit(0); } buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connect_fd); } close(socket_fd); }

客戶端:

/* File Name: client.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv) { int sockfd, n,rec_len; char recvline[4096], sendline[4096]; char buf[MAXLINE]; struct sockaddr_in servaddr; if( argc != 2){ printf("usage: ./client <ipaddress>\n"); exit(0); } if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf("inet_pton error for %s\n",argv[1]); exit(0); } if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ printf("connect error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("send msg to server: \n"); fgets(sendline, 4096, stdin); if( send(sockfd, sendline, strlen(sendline), 0) < 0) { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); exit(0); } if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) { perror("recv error"); exit(1); } buf[rec_len] = '\0'; printf("Received : %s ",buf); close(sockfd); exit(0); }

代碼原文地址

總結(jié)

以上是生活随笔為你收集整理的socket(套接字)详解一种通讯机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品日韩av | 精品久久久久一区 | 天天射狠狠干 | 无码无套少妇毛多18pxxxx | 久久精品7 | 黄色动漫在线免费观看 | 欧洲色网| 操综合网| 国产熟女精品视频 | 91麻豆精品国产91久久久久久 | 欧美一级做a爰片免费视频 成人激情在线观看 | 91av影视| 污视频在线播放 | 欧美精品性视频 | 国产高清精品在线观看 | 国产精品国产三级国产播12软件 | 美女被日网站 | 日本中文字幕高清 | 中文字幕一区二区三区人妻电影 | 尤物在线视频 | 亚洲综人| 婷婷综合色| 久久激情小说 | 欧美一区二区三区成人 | 69堂精品| 性视频一区 | 成年人看片网站 | 在线视频 日韩 | 美女网站视频在线观看 | 色偷偷91 | 欧美一性一乱一交一视频 | 亚洲丝袜天堂 | 九九色综合网 | 九九视频在线观看 | 国内黄色片 | 二十四小时在线更新观看 | 欧美福利视频一区二区 | 91香焦视频 | 亚洲精品一区二区三区四区五区 | 久久精品毛片 | 欧美日本高清 | 午夜精品久久久久久久久久 | 人民的名义第二部 | 欧美一级爽aaaaa大片 | 四级黄色片| 婷婷亚洲五月色综合 | 欧美精品久久久久久 | 久久亚洲国产精品 | 久久精品www人人爽人人 | 40一50一60老女人毛片 | 日韩a级片| 日本激情视频一区二区三区 | 黄色av影视| 99精品在线免费观看 | 精品一区二区三区入口 | 全黄一级片| 最近中文字幕在线中文高清版 | 天天干天天插天天操 | www国产精品内射熟女 | 欧美日韩久久婷婷 | 亚洲美女中文字幕 | aa爱做片免费 | 在线视频 一区二区 | 97伊人久久 | 色综合色综合网色综合 | 日本一区二区三区在线看 | 亚洲妇女av | 亚洲免费精品视频在线观看 | 人妻久久久一区二区三区 | 超碰96在线| 人妻内射一区二区在线视频 | 强伦人妻一区二区三区视频18 | 国产乱码久久久久久 | 欧美jizz18性欧美 | 亚洲视频999 | 麻豆传媒在线看 | 老牛av一区二区 | 五月涩| 一区二区免费在线视频 | 国产91丝袜 | 成人在线免费网站 | 爱情岛论坛亚洲品质自拍 | 日韩视频在线免费观看 | 欧美无砖专区免费 | 黄色三级免费网站 | 婷婷五月花 | 久久av在线播放 | 亚洲资源在线观看 | 精品综合久久久久 | 日韩av自拍| 亚洲成人一二三 | 国产成人精品一区二区三区 | 久久亚洲伊人 | 天堂а在线中文在线新版 | av永久 | 国产精品视频区 | 亚洲免费av一区 | xxxx18日本| 成人二区三区 |