socket 程式設計

2022-08-10 09:51:15 字數 2339 閱讀 4827

socket 程式設計

linux下tcp通訊

方法一、fcntl 函式可以將乙個socket 控制代碼設定成非阻塞模式,設定之後每次的對於sockfd 的操作都是非阻塞的。

flags = fcntl(sockfd, f_getfl, 0); //

獲取檔案的flags值。

fcntl(sockfd, f_setfl, flags | o_nonblock); //

設定成非阻塞模式;

flags = fcntl(sockfd,f_getfl,0

);fcntl(sockfd,f_setfl,flags&~o_nunblock); //

設定成阻塞模式;

方法二、recv, send 函式的最後有乙個flag 引數可以設定成msg_dontwait

臨時將sockfd 設定為非阻塞模式,而無論原有是阻塞還是非阻塞。

recv(sockfd, buff, buff_size,msg_dontwait); //

非阻塞模式的訊息傳送

send(scokfd, buff, buff_size, msg_dontwait); //

非阻塞模式的訊息接受

注意:linux中send函式msg_nosignal異常訊息

linux 下當連線斷開,還傳送資料的時候,不僅 send() 的返回值會有反映,而且還會向系統傳送乙個異常訊息,如果不作處理,系統會出 brokepipe,程式會退

出,這對於伺服器提供穩定的服務將造成巨大的災難。為此,send() 函式的最後乙個引數可以設定為 msg_nosignal,禁止 send() 函式向系統傳送常訊息。

#include int socket(int family, int type, int protocol); //

指定期望的通訊協議型別,

返回的檔案描述符和套接字描述符類似,我們成為套接字描述符,簡稱sockfd

af_inet ipv4協議 sock_stream(常用) 位元組流套接字 protocol:協議型別的常量或設定為0,以選擇給定的family和type組合的系統預設值

#includeint inet_pton(int family,const

char *strptr,void *addrptr);//

成功返回1,格式不對返回0,出錯返回-1

作用:p代表表示式 n代表數值 以後所寫的所有**中都有可能會需要這個函式,所以這個函式很重要

將char所指向的字串,通過addrptr指標存放

需要注意的是:當他發生錯誤的時候,errno的值會被置為eafnosupport 

#include int connect(int sockfd,const

struct sockaddr* servaddr,socklen_t addrlen);//

用connect函式來建立與tcp伺服器的連線

#include

int close(int sockfd);//

關閉socket,並終止tcp連線

#include

int bind(int sockfd,const

struct* myaddr,socklen_t addrlen);//

把本地協議位址賦予乙個套接字。

//也就是將32位的ipv4或128位ipv6與16位的tcp或者udp組合

#include

int listen(int sockfd,int backlog)//

成功返回0,失敗返回-1 listen函式僅由tcp伺服器呼叫

listen函式將會做兩件事:

1:我們在建立套接字的時候使用了socket函式,它建立的套接字是主動套接字,bind函式的功能就是通過這個將主動套接字,變成被動套接字,

告訴核心應該接受指向這個套接字的請求,closed狀態變成listen狀態。

2:本函式的第二個引數規定了核心要為該套接字排隊的最大連線個數。

#include int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);//

成功返回描述符,失敗返回-1

1、如果第二三個引數為空,代表了,我們對客戶的身份不感興趣,因此置為null;

2、第乙個引數為socket建立的監聽套接字,返回的是已連線套接字,兩個套接字是有區別的,而且非常重要。區別:我們所建立的監聽套接字

一般伺服器只建立乙個,並且一直存在。

而核心會為每乙個伺服器程序的客戶連線建立乙個連線套接字,當伺服器完成對某個給定客戶的服務時,連線套接字就會被關閉。

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...

socket程式設計

建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...