基本SOCKET操作範例



本週末在複習基本的socket操作,並在Ubuntu 14.04.4上編譯完成,
程式碼和執行檔都已經放在github上,有需要請自由取用!

https://github.com/Mirochiu/socket_practice

包含三個部分

  • socket_file  用socket file為媒介傳送封包
  • socket_inet 用socket傳送網路TCP封包
  • socket_udp 用socket傳送網路UDP封包

file的部分
只是看範例寫寫看,參考就好。這個方法的socket系統會依照指定名稱建立一個socket file,藉此讓兩者溝通。不正常結束程式時,系統不會自動刪除該socket檔案,就會造成下次啟動程式的一些問題,所以一般會先刪除(unlink)掉之前使用的socket檔案。

在inet的部分
有client和server可以做連線傳封包,不過用法是有些錯誤的。這些錯誤在client2和server2把它修正了,修正的部分是endian在探討。
電腦記憶體的byte-order架構,在x86電腦上是用little,但是網路協定是用big-endian,如果ip/port設定不經過轉換,你就會發現程式無法跟網路上的其他電腦溝通。showlisten.sh就是用來顯示Ubuntu中實際程式有開了哪個port。(記得使用時要給它執行權限)

另外寫了getifaces, getifaceinfo, getipbyname則是顯示電腦上的全部網路卡、顯示網路卡目前的IP, MAC, Netmask資訊、網站名稱(例如:www.google.com)與實際上主機IP查詢功能。

在udp的部分
包含sender和reciver可以做UDP封包的傳接,這裡使用的是unconnect udp socket,sender是固定500毫秒送一些資料出去。這部分為了只關注UDP的封包,在socket建立時就指定protocol為UDP。不過得記得要接收資料還是需要用bind將socket綁訂在本機的特定port上,然後傳送資料要使用,並且傳送資料接收資料應該換成 recvfrom和sendto而不再是read和write。

udpp2p的部分,是將port獲得的upd封包內容,經由另一個port送出去,也就是轉port動作,類似NAT會將外部傳送到特定port的資料都轉送給別的電腦。下指令可以偷懶用udpp2p :12345 :54321來建立在本機port 12345接收資料然後轉送給本機port 54321,然後開個reciver 54321來接收udpp2p所轉過來的資料,再開sender 12345持續送資料,你就會看到sender的資料,reciver會收到,而sender和reciver明明是不同port。

留言