網路程式設計socket程式分析

2021-10-06 20:14:12 字數 2606 閱讀 8422

linux下得socket

//建立套接字

int serv_sock = socket(af_inet, sock_stream, ipproto_tcp); 

引數 af_inet 表示使用 ipv4 位址

sock_stream 表示使用面向連線的套接字

ipproto_tcp 表示使用 tcp 協議

windows下得socket

//建立套接字

socket servsock = socket(pf_inet, sock_stream, ipproto_tcp);

//將套接字和ip、埠繫結

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr));  //每個位元組都用0填充

serv_addr.sin_family = af_inet; //使用ipv4位址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的ip位址

serv_addr.sin_port = htons(1234); //埠

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

通過 bind() 函式將套接字 serv_sock 與特定的 ip 位址和埠繫結,ip 位址和埠都儲存在 sockaddr_in 結構體中。

windows下得socket

bind(servsock, (sockaddr*)&sockaddr, sizeof(sockaddr));

socket() 函式確定了套接字的各種屬性,bind() 函式讓套接字與特定的ip位址和埠對應起來

//進入監聽狀態,等待使用者發起請求

listen(serv_sock, 20);

被動監聽狀態           是指套接字一直處於「睡眠」中,直到客戶端發起請求才會被「喚醒」。

windows下得socket

//進入監聽狀態

listen(servsock, 20);

//接收客戶端請求

struct sockaddr_in clnt_addr;

socklen_t clnt_addr_size = sizeof(clnt_addr);

int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); 

accept() 函式用來接收客戶端的請求。程式一旦執行到 accept() 就會被阻塞(暫停執行),直到客戶端發起請求。

windows下得socket

socket clntsock = accept(servsock, (sockaddr*)&clntaddr, &nsize);

//向客戶端傳送資料

char str = "";

write(clnt_sock, str, sizeof(str));

write() 函式用來向套接字檔案中寫入資料,也就是向客戶端傳送資料。

socket 在使用完畢後也要用 close() 關閉。

//向伺服器(特定的ip和埠)發起請求

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr)); //每個位元組都用0填充

serv_addr.sin_family = af_inet; //使用ipv4位址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的ip位址

serv_addr.sin_port = htons(1234); //埠

connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

通過 connect() 向伺服器發起請求,伺服器的ip位址和埠號儲存在 sockaddr_in 結構體中。直到伺服器傳回資料後,connect() 才執行結束。

//讀取伺服器傳回的資料

char buffer[40];

read(sock, buffer, sizeof(buffer)-1);

通過 read() 從套接字檔案中讀取資料。

windows下得socket

send(clntsock, str, strlen(str)+sizeof(char), null);

windows 下的 socket 程式依賴 winsock.dll 或 ws2_32.dll,必須提前載入。

dll 有兩種載入方式隱式載入(載入時載入)和顯式載入(執行時載入)

linux 不區分 socket 檔案和普通檔案,而 windows 區分;linux 下 socket() 函式的返回值為 int 型別,而 windows 下為 socket 型別,也就是控制代碼。

linux 下使用 read() / write() 函式讀寫,而 windows 下使用 recv() / send() 函式傳送和接收。

關閉 socket 時,linux 使用 close() 函式,而 windows 使用 closesocket() 函式。

Socket網路程式設計 聊天程式 8

上一節已經完成了對使用者的身份驗證了,既然有了驗證,那麼接下來就能對不同的客戶端進行區分了,所以這一節講實現私聊功能。就是通過伺服器對客戶端的資料進行 到特定的使用者上,實現私聊功能的聊天程式 實現的技術細節是 對客戶端傳送的資料增加乙個標識頭,由於我們處理的是純文字,所以為了講解的方便就把標識頭加...

網路程式設計 Socket程式設計

一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...

socket網路程式設計

首先認識乙個表示主機資訊的結構體 struct hostent h addrtype 這是表示主機所使用的位址型別的定義,在c語言winsock2.h標頭檔案中以 af 開頭的巨集定義就是它的值。如果使用的是ipv4,則值為 af inet 如果是ipv6,值為 af inet4 h length ...