socket編程常見函數使用方法

socket知識

有了IP地址,socket可知道是與哪一臺主機的哪一個進程通信

有了端口號,就知道是這個進程的哪一個套接字進行傳輸

應用進程使用描述符與它的套接字進行通信,也就是說一個進程創建一個套接字時就會返回一個套接字描述符
在這里插入圖片描述

socket的地址信息最重要

已定義了結構sockaddr_in:,使用TCP/IP協議族的網絡應用程序聲明端點地址變量時,使用結構sockaddr_in

struct sockaddr_in 
{u_char sin_len; 	//地址長度u_char sin_family;	//地址族 TCP/IP的地址是AF_INETu_short sin_port;	//端口號struct in_addr sin_addr;	//IP地址char sin_zero[8];	//未用
}

socket api(WinSock)

windows環境下,先使用WSAStartup初始化Windows Sockets API,然后應用程序執行任務,最后執行WSACleanup釋放所使用的Windows Sockets DLL占用的系統資源,接觸與socket庫的綁定。

WSAStartup

int WSAStartup(WORD wVersionRequested,LPWSADATA IpWSAData);

使用Socket的應用程序在使用Socket之前必須首先調用WSAStartup函數

兩個參數:

  • 第一個參數指明程序請求使用WinSock版本,高位字節指明副版本、低位字節指明主版本

    • 0x102表示2.1版本
  • 第二個參數返回實際的WinSock的版本信息

    • 指向WSADATA結構的指針

例:使用2.1版本WinSock的程序代碼段

wVersionRequested = MAKEWORD(2,1);
err = WSAStartup(wVersionRequested,&wsaData);

socket

該函數創建套接字

sd = socket(protofamily,type,proto);
  • 創建套接字

  • 操作系統返回套接字描述符(sd)

  • 第一個參數(協議族):protofamily = PF_INET (TCP/IP)

  • 第二個參數(套接字類型):

    • type = SOCK_STREAM,SOCK_DGRAM or SOCK_RAW(TCP/IP)
  • 第三個參數(協議號):0為默認

例:創建一個流套接字的代碼段

struct protoent *p;
p = getprotobyname("tcp");
SOCKET sd = socket(PF_INET,SOCK_STREAM,p->p_proto);

不同類型的socket用于應用層與下層不同協議進行溝通。需要注意的是原始套接字SOCK_RAW需要擁有比較高的權限

在這里插入圖片描述

TCP提供的服務特點:

可靠、面向連接、字節流傳輸、點對點

UDP提供的服務特點:

不可靠、無連接、數據報傳輸

Closesocket

int closesocket(SOCKET sd);
  • 關閉一個描述符為sd的套接字

  • 如果多個進程共享一個套接字,調用closesocket,將套接字引用計數減1,減至0才關閉

  • 一個進程中的多線程對一個套接字的使用無計數

    • 如果進程中的一個線程調用closesocket將一個套接字關閉,該進程中的其他線程也將不能訪問該套接字
  • 返回值:0成功,SOCKET_ERROR不成功

bind

套接字創建的時候可能并沒有地址 ,可以調用bind函數產生一個地址,或者說是用來綁定套接字的本地端點地址

int bind(sd,localaddr,addrlen);

端點地址其實就是IP地址 + 端口號

  • 參數

    • 套接字描述符 sd
    • 端點地址 localaddr,結構為sockaddr_in
    • 地址長度
  • 客戶程序一般不必顯式調用bind函數,因為操作系統會幫助我們設置客戶端的端點地址

  • 對于服務器端需要調用,用來指定熟知端口號以及IP地址。如果服務器主機有多個網卡,產生多個ip地址,需要使用地址通配符,INADDR_ANY。表示在服務器運行的主機上任何一個可用ip地址都是可以用來傳輸的

listen

int listen(sd,queuesize);
  • 置服務器端的流套接字處于監聽狀態

    • 僅服務器端調用
    • 僅用于面向連接的流套接字
  • 設置連接請求隊列(緩存)大小

  • 返回值: 成功為0,失敗為SOCKET_ERROR

connect

connect(sd,saddr,saddrlen);
  • 客戶程序調用connect函數來使客戶套接字sd與特定計算機的特定端口saddr的套接字服務進行連接
  • 僅僅用于客戶端
  • 可用于TCP客戶端也可以用于UDP客戶端
    • TCP客戶端:建立了TCP連接
    • UDP客戶端:只指定服務器端點地址

accept

newsock = accept(sd,caddr,caddrlen);
  • 服務程序調用accept函數從處于監聽狀態的流套接字sd的客戶連接請求隊列中取出排在最前的一個客戶請求,并且創建一個新的套接字來與客戶套接字創建連接通道

    • 僅僅用于TCP套接字
    • 僅僅用于服務器
  • 利用新創建的套接字newsock與客戶通信

為什么要這樣做呢?因為TCP是點對點的,說明只能連接客戶端和服務器的兩個套接字。如果不這么做,就會導致TCP服務器在同一時刻只能為某一個客戶提供服務,不能實現并發了。

在這里插入圖片描述

send,sendto

send(sd,*buf,len,flags);
sendto(sd,*buf,len,flags,destaddr,addrlen);
  • send函數用于TCP套接字(客戶與服務器)或調用了connect函數的UDP客戶端套接字
    • sendto函數用于UDP服務器端套接字與為調用connect函數的UDP客戶端套接字

recv,recvfrom

與上面的send、sendto對應

recv(sd,*buffer,len,flags);
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
  • recv函數從TCP連接的另一端接收數據,或者從調用了connect函數的UDP客戶端套接字接收服務器發來的數據
  • recvfrom函數用于從UDP服務器套接字與未調用connect函數的UDP客戶端套接字接收對端數據

setsockopt,getsockopt

int setsockopt(int sd,int level,int optname,*optval,int optlen);
int getsockopt(int sd,int level,int optname,*optval,int socklen_t* optlen);
  • setsockopt()函數用來設置套接字sd的選項參數
  • getsockopt()函數用來獲取任意類型、人影狀態的套接口的選項當前值,并吧結果存入optval

簡單小結

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

需求變更流程不規范,項目早晚得完蛋

很多人,做的項目不少,但成功的不多。這是一個值得深思的問題。 項目為什么這么難做?需求蔓延,客戶難搞是基本原因。 如何解決上述問題: 1)強化需求調研和項目設計在整個項目中的重要性 一般地,需…

html 表格套表格_HTML表格

html 表格套表格A table is a set of rows and columns, which could be created on a webpage in HTML, by <table> tag. The tabular representation of complex data makes it readable. 表格是一組行和列&#xff0c;可以通過<table>標簽在HTML網頁上創建。 復…

Android判斷界面

仿造微信&#xff0c;第一次進入去引導界面&#xff0c;否則進啟動界面。 package edu.hpu.init;import edu.hpu.logic.R;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.H…

HDU計算機網絡系統2021復習提綱

目錄計算機網絡系統的主要功能TCP/IP模型與OSI模型的層次結構及各層功能。&#xff08;掌握&#xff09;TCP/IP參考模型各層次所對應的主要設備局域網的體系結構與IEEE.802標準數據鏈路層的編址方式和主要設備原理數據鏈路層CSMA/CD的技術原理交換機VLAN原理與劃分方法數據鏈路…

ruby 線程id_Ruby中的線程

ruby 線程idRuby線程 (Ruby Threads) In Ruby, with the help of threads, you can implement more than one process at the same time or it can be said that Thread supports concurrent programming model. Apart from the main thread, you can create your thread with …

Dynamic web project --- AspectJ Project

本來想今天晚上 直接轉到 以前的web項目 做測試。。。可惜在eclipse 添加 aspectj的時候 提示我不是 aspectj項目。。于是我就百度了好久&#xff0c;發現好多人都和我一樣 &#xff0c; 不過我也發現了一些可以的 比如右鍵 AJDTtools --> convert to Aspectj Project ,可惜…

2013 南京邀請賽 A play the dice 求概率

1 /**2 大意&#xff1a;給定一個色子&#xff0c;有n個面&#xff0c;每一個面上有一個數字&#xff0c;在其中的m個面上有特殊的顏色&#xff0c;當擲出的色子出現這m個顏色之一時&#xff0c;可以再擲一次。。求其最后的期望3 思路&#xff1a;假設 期望為ans4 ans 1/…

擲骰子

Description: 描述&#xff1a; In this article, we are going to see a dynamic programing problem which can be featured in any interview rounds. 在本文中&#xff0c;我們將看到一個動態的編程問題&#xff0c;該問題可以在任何采訪回合中體現。 Problem statement:…

《YOLO算法筆記》(草稿)

檢測算法回顧 5、6年前的檢測算法大體如下&#xff1a; 手動涉及特征時應該考慮的因素&#xff1a; 1、尺度不變性 2、光照不變性 3、旋轉不變性 這一步驟稱為特征工程&#xff0c;最重要的一個算法稱為sift&#xff0c;(回顧SIFT講解)體現了上述所有的觀點。 在分類的過程中…

U盤安裝Centos6.3

一 首先下載Centos6.3的光盤鏡像文件&#xff0c;網上到鏡像實在是太多了。 CentOS-6.3-i386-bin-DVD1.iso CentOS-6.3-i386-bin-DVD2.iso 二 下載個新版本的UltraISO, 在其菜單“啟動”下有“寫入硬盤鏡像“功能到&#xff0c;原來用到綠色版本是8.6.2.2011不支持&#xff0c;…

[轉]粵語固有辭彙與漢語北方話辭彙對照

本文轉自&#xff1a;http://beta.wikiversity.org/wiki/%E7%B2%B5%E8%AA%9E%E5%9B%BA%E6%9C%89%E8%BE%AD%E5%BD%99%E8%88%87%E6%BC%A2%E8%AA%9E%E5%8C%97%E6%96%B9%E8%A9%B1%E8%BE%AD%E5%BD%99%E5%B0%8D%E7%85%A7 粵語固有辭彙與漢語北方話辭彙對照 「粵語」&#xff08;或稱「…

openlayer調用geoserver發布的地圖實現地圖的基本功能

轉自&#xff1a;http://starting.iteye.com/blog/1039809 主要實現的功能有放大&#xff0c;縮小&#xff0c;獲取地圖大小&#xff0c;平移&#xff0c;線路測量&#xff0c;面積測量&#xff0c;拉寬功能&#xff0c;顯示標注&#xff0c;移除標注&#xff0c;畫多邊形獲取經…

LLVM與Codegen技術

LLVM 百度百科 LLVM是構架編譯器(compiler)的框架系統&#xff0c;以C編寫而成&#xff0c;用于優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time)&#xff0c;對開發者保持開放&#xff0c;并兼容已有…

跟烏克蘭人學編程1

今天要Disable一個菜單&#xff0c;工程項目多&#xff0c;不容易找。 烏克蘭人建議我用Spy&#xff0c;將靶拖到目標窗體上就可以看到類名。轉載于:https://www.cnblogs.com/SunWentao/archive/2012/12/19/2825220.html

html網頁轉圖片_HTML圖片

html網頁轉圖片HTML圖片 (HTML Images) Images are visuals of something that look elegant. In web pages, images are used to create a good and appealing design. 圖像是外觀精美的視覺效果。 在網頁中&#xff0c;圖像用于創建良好且吸引人的設計。 The <img> ta…

Android學習拾遺

1. java中的flush()作用&#xff1a;強制將輸出流緩沖區的數據送出。 2. 文件存儲&#xff1a; 存儲到內部&#xff1a;另外使用一個class實現&#xff0c;最開始初始化用了this,后來放在這里不合適&#xff0c;改成了帶參數的構造方法。 包括存儲、讀取、追加 讀取&#xff1a…

OLAP 技術之列式存儲與數據壓縮(快查詢方法之一)

前言 列式存儲和數據壓縮&#xff0c;對于一款高性能數據庫來說是必不可少的特性。一個非常流行的觀點認為&#xff0c;如果你想讓查詢變得更快&#xff0c;最簡單且有效的方法是減少數據掃描范圍和數據傳輸時的大小&#xff0c;而列式存儲和數據壓縮就可以幫助我們實現上述兩…

sql 視圖嵌套視圖_SQL視圖

sql 視圖嵌套視圖SQL | 觀看次數 (SQL | Views) Views in SQL are virtual tables. A view also has rows and columns as theyre during a real table within the database. We will create a view by selecting fields from one or more tables present within the database.…

Postgresql多線程hashjoin(inner join)

pg hashjoin 節點大致步驟&#xff1a; 1、分塊與分桶。對一個表hash時&#xff0c;確定塊數和桶數量。&#xff08;一塊被劃分為10個元組的桶&#xff09;確定分塊號與分桶號是由hashvalue決定的。 2、執行&#xff1a; 1、順序獲取S表中所有元組&#xff0c;對每一條元組Has…

iframe實現局部刷新和回調--開篇

今天做項目遇到一個問題。就是提交表單的時候&#xff0c;驗證用戶名是否存在和驗證碼是否正確。 當驗證碼或者用戶名存在的時候。在后臺彈窗提示。可頁面原本file里面符合要求的值刷新沒了。用戶體驗不好。因為用ifream刷新技術已不是什么新鮮技術。所以網上有大把的資料可參考…