五 socket實踐程式設計

2022-08-01 08:54:06 字數 2388 閱讀 4937

1、伺服器端程式編寫

(1)socket

(2)bind

(3)listen

(4)accept,返回值是乙個fd,accept正確返回就表示我們已經和前來連線我的客戶端之間建立了乙個tcp連線了,以後我們就要通過這個連線來和客戶端進行讀寫操作,讀寫操作就需要乙個fd,這個fd就由accept來返回了。

注意:socket返回的fd叫做監聽fd,是用來監聽客戶端的,不能用來和任何客戶端進行讀寫;accept返回的fd叫做連線fd,用來和連線那端的客戶端程式進行讀寫。

2、客戶端程式編寫

(1)socket

(2)connect

概念:埠號,實質就是乙個數字編號,用來在我們一台主機中(主機的作業系統中)唯一的標識乙個能上網的程序。埠號和ip位址一起會被打包到當前程序發出或者接收到的每乙個資料報中。每乙個資料報將來在網路上傳遞的時候,內部都包含了傳送方和接收方的資訊(就是ip位址和埠號),所以ip位址和埠號這兩個往往是打包在一起不分家的。

#include #include 

#include

/*see notes

*/#include

#include

#include

#define serport 9003

#define seraddr "192.168.1.141" //

ifconfig看到的

#define backlog 100

char recvbuf[100

];int main(void);

struct sockaddr_in cliaddr = ;

char ipbuf[30] = ;

sockfd = socket(af_inet, sock_stream, 0

);

if (-1 ==sockfd)

printf(

"socketfd = %d.\n

", sockfd);

//seraddr.sin_family = af_inet; //

設定位址族為ipv4

// 設定位址的埠號資訊,乙太網通訊,我們預設為大端模式,這裡埠號,我們要進行轉換,htons表示將整型變數從主機位元組順序轉變成網路位元組順序, 就是整數在位址空間儲存方式變為:高位元組存放在記憶體的低位址處

seraddr.sin_port = htons(serport);   

// //設定ip位址,inet_addr將10進製字串ip位址轉換為二進位制網路位元組序,這個函式裡面做了大端處理,不過inet_addr只適用於ipv4,現在一般使用inet_pton,它適用於ipv4和ipv6

seraddr.sin_addr.s_addr = inet_addr(seraddr);

ret = bind(sockfd, (const

struct sockaddr *)&seraddr, sizeof

(seraddr));

if (ret < 0

)

printf(

"bind success.\n");

//第三步:listen監聽埠,backlog為可掛載的監聽到的個數

ret = listen(sockfd, backlog); //

阻塞等待客戶端來連線伺服器

if (ret < 0

)

//第四步:accept阻塞等待客戶端接入

clifd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);

printf(

"連線已經建立,client fd = %d.\n

", clifd);

/*// 建立連線之後就可以通訊了

// 客戶端給伺服器發

ret = recv(clifd, recvbuf, sizeof(recvbuf), 0);

printf("成功接收了%d個位元組\n", ret);

printf("client傳送過來的內容是:%s\n", recvbuf);

*//*

// 客戶端反覆給伺服器發

while (1)

*///

伺服器給客戶端發

strcpy(recvbuf, "

hello world.");

ret = send(clifd, recvbuf, strlen(recvbuf), 0

); printf(

"傳送了%d個字元\n

", ret);

return0;

}

socket程式設計實踐

socket程式設計 1 函式說明。socket 程式設計的基本函式有 socket bind listen accept send sendto recv 以及 recvfrom 等,其中根據客戶端還是服務端,或者根據使用 tcp 協議還是 udp 協議,這些函式的呼叫流程都有所區別,這裡先對每個...

socket程式設計實踐

建立連線 1.1socket 非常類似於open函式,用來開啟乙個網路連線,如果成功則返回乙個網路檔案描述符 int型別 之後我們操作這個網路連線都通過這個網路檔案描述符 1.2bind繫結的意思 好比是ioctl 1.3listen監聽 1.4connect連線 客戶端 傳送和接收 2.1 sen...

socket程式設計(五)

1 recv只能接收套接字io 2 recv有flags選項 3 recv選項 msg oob接收帶外資料,通過緊急指標,tcp選項 4 recv選項 msg peek接收緩衝區中的資料,但是不將緩衝區中的資料清除 從套介面接收資料,但是不從緩衝區中移除msg peek 只要有偷看到資料就接收,沒有...