Linux C Socket编程,这篇文章让我耳目一新
目錄
1. ??什么是TCP/IP、UDP?
2. ? Socket在哪里呢?
3. ? Socket是什么呢?
4. ??有很多的框架,為什么還在從Socket開始?
5.?? Linux C Socket簡單示例
1.什么是TCP/IP、UDP?
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個工業(yè)標準的協(xié)議集,它是為廣域網(wǎng)(WANs)設計的。
UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應的協(xié)議。它是屬于TCP/IP協(xié)議族中的一種。
下面的圖表明了這些協(xié)議的關系。
2.Socket在哪里呢?
3.Socket是什么呢?
Socket是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
門面模式,用自己的話說,就是系統(tǒng)對外界提供單一的接口,外部不需要了解內(nèi)部的實現(xiàn)。
4.有很多的框架,為什么還在從Socket開始?
現(xiàn)在的跨平臺網(wǎng)絡編程框架很多,如Java的SSH,C/C++的Boost等。
現(xiàn)在的分布式框架很多,如Hadoop等。
我的任務是把一個C/C++程序做成分布式,要求的不配環(huán)境,基本屬于純計算的,結(jié)果很小。所以選擇了Socket。
重要的是Socket是分布式、云計算、網(wǎng)絡編程的基礎,對Socket的學習有利于對其他框架的理解。
下圖是Socket編程的基本流程:
5.Linux C Socket簡單實例與詳細注釋
程序為簡單的“回射”,客戶端將控制臺輸入的信息發(fā)送給服務器端,服務器原樣返回信息。
服務器端:
#include?<sys/types.h> #include?<sys/socket.h> #include?<stdio.h> #include?<netinet/in.h> #include?<arpa/inet.h> #include?<unistd.h> #include?<string.h> #include?<stdlib.h> #include?<fcntl.h> #include?<sys/shm.h>#define?MYPORT??8887 #define?QUEUE???20 #define?BUFFER_SIZE?1024int?main() {///定義sockfdint?server_sockfd?=?socket(AF_INET,SOCK_STREAM,?0);///定義sockaddr_instruct?sockaddr_in?server_sockaddr;server_sockaddr.sin_family?=?AF_INET;server_sockaddr.sin_port?=?htons(MYPORT);server_sockaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);///bind,成功返回0,出錯返回-1if(bind(server_sockfd,(struct?sockaddr?*)&server_sockaddr,sizeof(server_sockaddr))==-1){perror("bind");exit(1);}///listen,成功返回0,出錯返回-1if(listen(server_sockfd,QUEUE)?==?-1){perror("listen");exit(1);}///客戶端套接字char?buffer[BUFFER_SIZE];struct?sockaddr_in?client_addr;socklen_t?length?=?sizeof(client_addr);///成功返回非負描述字,出錯返回-1int?conn?=?accept(server_sockfd,?(struct?sockaddr*)&client_addr,?&length);if(conn<0){perror("connect");exit(1);}while(1){memset(buffer,0,sizeof(buffer));int?len?=?recv(conn,?buffer,?sizeof(buffer),0);if(strcmp(buffer,"exit\n")==0)break;fputs(buffer,?stdout);send(conn,?buffer,?len,?0);}close(conn);close(server_sockfd);return?0; }客戶端:
#include?<sys/types.h> #include?<sys/socket.h> #include?<stdio.h> #include?<netinet/in.h> #include?<arpa/inet.h> #include?<unistd.h> #include?<string.h> #include?<stdlib.h> #include?<fcntl.h> #include?<sys/shm.h>#define?MYPORT??8887 #define?BUFFER_SIZE?1024int?main() {///定義sockfdint?sock_cli?=?socket(AF_INET,SOCK_STREAM,?0);///定義sockaddr_instruct?sockaddr_in?servaddr;memset(&servaddr,?0,?sizeof(servaddr));servaddr.sin_family?=?AF_INET;servaddr.sin_port?=?htons(MYPORT);??///服務器端口servaddr.sin_addr.s_addr?=?inet_addr("127.0.0.1");??///服務器ip///連接服務器,成功返回0,錯誤返回-1if?(connect(sock_cli,?(struct?sockaddr?*)&servaddr,?sizeof(servaddr))?<?0){perror("connect");exit(1);}char?sendbuf[BUFFER_SIZE];char?recvbuf[BUFFER_SIZE];while?(fgets(sendbuf,?sizeof(sendbuf),?stdin)?!=?NULL){send(sock_cli,?sendbuf,?strlen(sendbuf),0);?///發(fā)送if(strcmp(sendbuf,"exit\n")==0)break;recv(sock_cli,?recvbuf,?sizeof(recvbuf),0);?///接收fputs(recvbuf,?stdout);memset(sendbuf,?0,?sizeof(sendbuf));memset(recvbuf,?0,?sizeof(recvbuf));}close(sock_cli);return?0; }執(zhí)行:
客戶端
服務器端
文章轉(zhuǎn)自:https://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網(wǎng)盤鏈接。
歡迎點贊,關注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關注我的公眾號
總結(jié)
以上是生活随笔為你收集整理的Linux C Socket编程,这篇文章让我耳目一新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kuangbin题单
- 下一篇: 跟韦老师聊了一个深夜