Linux網絡編程學習總結_第1頁
Linux網絡編程學習總結_第2頁
Linux網絡編程學習總結_第3頁
Linux網絡編程學習總結_第4頁
Linux網絡編程學習總結_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、linux網絡編程學習總結項冃組:開發(fā)組姓名:李向勇老師:喬永峰h期:2015.12.09linux網絡編程學習總結1目錄3一、socket 結構31. struct sockaddr 通用套接字32. struct sockaddrjn 實際使用套接字3二、socket 類型41. sock_stream42. sock_dgram43. sock_ram4三、tcp網絡編程架構41.服務器客戶端交互42 服務器函數51) socket()52) bind()63) listen()74) accept)75) send()/write()86) recv()/read()97) close

2、f)93. 客戶端函數101) socket()102) connect()103) send()104) recv()115) close()11四、服務器客戶端的例子111 服務器接收/發(fā)送112 .客戶端接收/發(fā)送123. makefile 編寫144. 線程141) 線程倉u建 pthread_create()142) pthreadjoin()153) pthread_exit()155. 使用到的其他函數161) htonl()/htons()162) fork()163) inet_pton()16目錄學習linux網絡編程也有一段吋間,在呂同學和喬老師的幫助下寫了 一個服務器與

3、客戶端之間收發(fā)消息的例子,下面就主要用到的知識點 作一回顧和總結。一、socket 結構1. struct sockaddr 通用套接字struct sockaddru_short sa_family;協議簇char sa_data14; /14字節(jié)的特定協議地址2. struct sockaddrjn實際使用套接字struct sockaddrj nu8 sinjen; /*struct sockaddrjn 的長度 16*/u8 sin_family;/*af_inet*/ul6sin_port;/*16 位端口號*/struct in_addr sin_addr;/*ip 地址 32 位

4、*/charsin_ zero8;struct in_addr 結構:struct in_ addr/32位ip地址,網絡字節(jié)序u32 s_addr;二 socket 類型1. sock_stream:流式套接字可以提供可靠的、面向連接的 通訊流,使用tcp協議。2. sock_dgram:數據報套接字定義了一種無連接的服務,數 據報通過相互獨立的報文進行傳輸,是無序的并且不保證可靠, 使用udp協議。3. sock_ram:原始套接字使用ip協議,用于新的網絡協議的 測試。三、tcp網絡編程架構1. 服務器客戶端交互客戶機進程socket ()服務器進程 socket ()bind ()li

5、sten ()connect ()send()服務請求recv () 應答信號close ()accept ()毎9有客戶的連接請求掛起,recv ()處理服務請求0send ()xecv ()結束連接通知圖一2. 服務器函數1) socketf)#inelude <sys/types.h>#inelude <sys/socket.h>int socket(int domain, int type, int protocol);創(chuàng)建一個socket,返冋值:非負數創(chuàng)建成功,-1創(chuàng)建失敗family:協議簇type:套接字的類型:是流式套接字?數據報套接字還是原始套接字p

6、rotocol:套接口所用的協議。如調用者不想指定,可用0其返冋值:調用成功就返冋新創(chuàng)建的套接字的描述符,如 果失敗就返回invalid_socket。綁定一個地址端口 bind()int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);用于綁定ip地址和端口號到socketsocket:是一個套接字。address:是一個sockaddr結構指針,該結構中包含了要結 合的地址和端口號。address jen:確定緩沖區(qū)的長度。其返回值:如果函數執(zhí)行成功,返回值為0,否則為socket_error。2) bind

7、()int bind(int sockfd.const struct sockaddr *myaddr,socklen_t addrle n);該函數用于綁定ip地址和端口號到socket osockfd:是一個套接字;myaddr:是一個sockaddr結構指針,該結構中包含了 耍結合的地址和端口號;addr len:確定緩沖區(qū)的長度;如果函數執(zhí)行成功,返冋值為0 ,否則為socket_erroro3) listen()int listen(int sockfd, int backlog);listen函數使用主動連接套接口變?yōu)楸贿B接套接口,使得一 個進程可以接受其它進程的請求,從而成為一個

8、服務器進程。 在tcp服務器編程中l(wèi)isten函數把進程變?yōu)橐粋€服務器,并指 定相應的套接字變?yōu)楸粍舆B接。listen函數在調用bind之后調用accept之前調用。sockfd:套接字描述符backlog: 連接請求隊歹ll(queue of pending connections)的最 大長度(一般由2到4)。用somaxconn則由系統確定。其返回值:無錯誤,返回0,否則,返回socket error, 可以調用函數wsagetlasterror取得錯誤代碼。4) accept()int accept(int sockfd, struct sockaddr *addr, socklen_

9、t *addrlen);該函數用來等待來自客戶端的socket連接請求。sockfd:套接字描述符addr:指向結構體sockaddr的指針。addrlen: addr參數指向的內存空間的長度。其返回值:成功返回新套接字描述符;失敗返回錯誤信息。5) send()/write()send()size_t send (in t s, const void *msg, size_t len , int flags);該函數用來發(fā)送數據s:發(fā)送端套接字描述符;msg:個存放應用程式要發(fā)送數據的緩沖區(qū);len:實際要發(fā)送的字節(jié)數;flags: 一般為 0其返回值:成功則返回實際傳送出去的字符數,失敗返

10、回1,錯誤原因存于errno中。write()int write(int fdzvoid *buf,size_t nbyte);write函數將buf中的length字節(jié)內容寫入文件描述符fd。fd:要寫的套接字buf:存放要寫的數據的緩沖區(qū)nbyte:緩沖區(qū)長度返回值:成功返回實際所寫的字節(jié)數,失敗時返回6) recv()/read()recv()int recv( int s, coid* msgbuf, size_t len, int flags);該函數用于接收數據s: 一個標識已連接套接口的描述字。msgbuf:用于接收數據的緩沖區(qū)。len:緩沖區(qū)長度。read()flags:指定調

11、用方式。size_t read(int fd,void *buf,size_t nbyte);該函數用于讀取fd中的內容。fd:要讀的套接字。buf:存放數據的緩沖區(qū)。nbyte:緩沖區(qū)長度。返回值:讀成功吋:read返回實際所讀的字節(jié)數返回的值是6表示已經讀到文件的結束了小于0:表示出現了錯誤。如果錯誤為eintr說明讀是由 中斷引起的,如果是econnrest表示網絡連接出了問題。7) close()int close(int fd);關閉socket連接,內核會釋放和關資源,關閉z后則不能 使用該文件描述符進行讀寫操作。3. 客戶端函數1) socket()同服務器socket()相同。

12、2) connect!)int connect (int sockfd,struct sockaddr * serv_addr,intaddrle n);該函數用于與服務器建立連接sockfd:套接字描述符serv_addr:指向數據結構sockaddr的指針,其中包括目的 端口和ip地址addrlen:參數二 sockaddr 的長度。(可以通過 sizeof (struct sockaddr)獲得)其返回值:成功則返回0,失敗返回3) send()同服務器send()相同。4) recv()同服務器recv()相同。5) close()四、服務器客戶端的例子1.服務器接收/發(fā)送/*proc

13、ess server recv*/void *process_server_recv(void *p) int sock_client = (int)p;ssize_t size = 0;char buffer1024;for(;)size = read(sock_client, buffer, 1024);訐(size > 0)write(l, buffer, size);/*寫到標準輸出*/*process server send*/void process_server_send(int sock_client)ssize_t size = 0;char buffer1024;fo

14、r(;)size = read(0, buffer, 1024);/*從標準輸入讀*/訐(size = 0)return;write(sock_client? buffer, size);/*發(fā)送給客戶端*/2.客戶端接收/發(fā)送/*process client recv*/void *process_client_recv(void *p)int sock_server = (int)p;ssize_t size = 0;char buffer1024;for(;)size = read(sock_server, buffer, 1024);訐(size = 0)return;write(l,

15、 buffer, size);/* process die nt sen d*/void process_client_send(int sock_server)ssize_t size = 0;char buffer1024;for(;)/*from stdin put read data to buffer*/size = read(0, buffer, 1024);訐(size > 0)write(sock_server, buffer, size);/*send to server*/3. makefile 編寫cc = gccalkclient serverdie nt:cli

16、e nt.o$(cc)o die nt die nt.o -ipthread server:server.o$(cc)o server server.o -ipthreadclean:rm -f die nt server *.o4.線程1) 線程創(chuàng)建 pthread_create()pthread_t pth;int pthread_create(pthread_t *thread, const pthtead_attr_t *attr, void*(*start_routine)(void *),void *arg); 第一個參數是thread的標識符,是一個pthread_t的變量;第二

17、個參數是thread的屬性(如線程棧的人小),null為默認參數; 第三個參數是函數指針,就是該線程要運行的代碼,即線程在源代碼 上的表現形式就是一個函數;第四個參數是傳遞給thread的參數。thread對應的函數體void *th(void *p);返回類型必須是一個void類型的指針,參數也必須是一個void類型指針。2) pthreadjoin()int pthreadjoin(pthread_t thread, void *retval);函數pthreadjoin用來等待一個線程的結束。thread:線程標識符,即線程id,標識唯一線程。retval:用戶定義的指針,用來存儲被等待

18、線程的返冋值。返回值:0代表成功。失敗,返回的則是錯誤號。3) pthread_exit()void pthread_exit(void* retval);線程通過調用pthread_exit函數終止執(zhí)行,就如同進程在結束時調用 exit函數一樣。這個函數的作用是,終止調用它的線程并返冋一個指 向某個對象的指針。5.使用到的其他函數1) htonl()/htons()#inelude <arpa/ineth>uint32_t htonl(uint32_t hostlong);將主機數轉換成無符號長整型的網絡字節(jié)順序。本函數將一個 32位數從主機字節(jié)順序轉換成網絡字節(jié)順序。uintl6_t htons(uintl6_t hostshort);將主機的無符號短整形數轉換成網絡字節(jié)順序。hostshort:主 機字節(jié)順序表達的16位數。2) fork()pid_t fork(void);pid_t是一個宏定義,其實質是int被定義在#include<sys/types.h> 中。返回值:若成功調用一次則返回兩個值,子進程返回0,父進程 返回子進程id;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論