1. 程式人生 > >第一講:編寫TCP Socket小程式

第一講:編寫TCP Socket小程式

根據下面的步驟編寫TCP Socket小程式。注意:作者必須是自己的名字。結果如下:

步驟: 1、用VC建立伺服器程式

 

建立一個win32控制檯程式

 

上面的程式碼如下,編寫程式碼的時候切換到FileView介面,其中StdAfx.cpp檔案不用編輯,直接點選“編譯”-->“連結“圖示就可以了:

注意必須要先編譯、連結這個檔案,否則後面會報錯。

我們需要在TServer.cpp程式碼裡面進行編輯

 

TServer.cpp程式碼如下:

伺服器端執行效果,記得設定防火牆允許訪問:

二、編寫客戶端,重開另外一個VC++6.0程式(不要在同一個VC++6.0程式裡面新建兩個工程),新建TClient工程(沒截圖,所有用舊圖,把下面的工程名稱TServer改成TClient)

勾選一個簡單的應用程式

編寫客戶端的程式碼,如下:

注:上面一行的 return 0;緊接著的是大括號}。如下:

      return 0;

}

執行效果(必須先開啟伺服器端):

1、先開啟伺服器端;

2、開啟客戶端。

 

最後看程式碼得知TCP程式設計步驟:

TCP程式設計的伺服器端一般步驟是: 
  1、建立一個socket,用函式socket(); 
  2、設定socket屬性,用函式setsockopt(); * 可選步驟
  3、繫結IP地址、埠等資訊到socket上,用函式bind(); 
  4、開啟監聽,用函式listen(); 
  5、接收客戶端上來的連線,用函式accept(); 
  6、收發資料,用函式send()和recv(),或者read()和write(); 
  7、關閉網路連線; 
  8、關閉監聽; 

TCP程式設計的客戶端一般步驟是: 
  1、建立一個socket,用函式socket(); 
  2、設定socket屬性,用函式setsockopt();* 可選 步驟
  3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選 步驟
  4、設定要連線的對方的IP地址和埠等屬性; 
  5、連線伺服器,用函式connect(); 
  6、收發資料,用函式send()和recv(),或者read()和write(); 
  7、關閉網路連線;

上面的函式send()和recv(),或者read()和write()的區別是:

一旦,我們建立好了tcp連線之後,我們就可以把得到的fd當作檔案描述符來使用。
由此網路程式裡最基本的函式就是read和write函數了。

寫函式write
ssize_t write(int fd, const void*buf,size_t nbytes);
write函式將buf中的nbytes位元組內容寫入檔案描述符fd.成功時返回寫的位元組數.失敗時返回-1. 並設定errno變數. 
讀函式read
ssize_t read(int fd,void *buf,size_t nbyte)
read函式是負責從fd中讀取內容.當讀成功 時,read返回實際所讀的位元組數,如果返回的值是0 表示已經讀到檔案的結束了,小於0表示出現了錯誤.如果錯誤為EINTR說明讀是由中斷引起 的, 如果是ECONNREST表示網路連接出了問題. 
recv和send


recv和send函式提供了和read和write差不多的功能.不過它們提供了第四個引數來控制讀寫操作.
int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三個引數和read,write一樣,第四個引數可以是0或者是以下的組合
_______________________________________________________________
| MSG_DONTROUTE | 不查詢表 |
| MSG_OOB | 接受或者傳送帶外資料 |
| MSG_PEEK | 檢視資料,並不從系統緩衝區移走資料 |
| MSG_WAITALL | 等待所有資料 |
|--------------------------------------------------------------|
MSG_DONTROUTE:是send函式使用的標誌.這個標誌告訴IP.目的主機在本地網路上面,沒有必要查詢表.這個標誌一般用網路診斷和路由程式裡面.
MSG_OOB:表示可以接收和傳送帶外的資料.關於帶外資料我們以後會解釋的.
MSG_PEEK:是recv函式的使用標誌,表示只是從系統緩衝區中讀取內容,而不清除系統緩衝區的內容.這樣下次讀的時候,仍然是一樣的內容.一般在有多個程序讀寫資料時可以使用這個標誌.
MSG_WAITALL是recv函式的使用標誌,表示等到所有的資訊到達時才返回.使用這個標誌的時候recv回一直阻塞,直到指定的條件滿足,或者是發生了錯誤. 1)當讀到了指定的位元組時,函式正常返回.返回值等於len 2)當讀到了檔案的結尾時,函式正常返回.返回值小於len 3)當操作發生錯誤時,返回-1,且設定錯誤為相應的錯誤號(errno).如果flags為0,則和read,write一樣的操作.還有其它的幾個選項,不過我們實際上用的很少,可以檢視 Linux Programmer's Manual得到詳細解釋。

視訊下載連結:

連結:https://pan.baidu.com/s/1_EMW1AtiqlvqZUY47jD5Mg 
提取碼:bmhv 
複製這段內容後開啟百度網盤手機