socket可以看成是一種特殊的檔案,所以可以通用「open--read/write--close」模式來操作。
socket()函式對應於普通的open()函式,用於建立乙個socket。原型 int
socket(
intdomain,
inttype,
intprotocol);
domain : 協議域/協議族(family)
type:指定socket型別
protocol :指定協議,一般預設為0,預設使用與type對應的協議
bind()函式:把乙個特定的位址賦給socket,即把"ip位址+埠號"與socket繫結。原型 int
bind
(int
sockfd,
const
struct
sockaddr *addr, socklen_t addrlen);
sockfd :要繫結的socket
伺服器bind()的addr,要bind伺服器的ip位址,一般使用127.0.0.1可以,但是如果伺服器有多塊網絡卡(多個ip),最好還是使用seraddr.sin_addr.s_un.s_addr=htonl(inaddr_any);//inaddr_any指任意ip
listen()、connect()函式
intlisten(int sockfd, int backlog);
intconnect(int sockfd, const
struct sockaddr *addr, socklen_t addrlen);
伺服器端在呼叫了socket()和bind()函式之後,呼叫listen()函式來監聽socket。然後客戶端呼叫connect()函式的時候,伺服器端就能收到連線請求(伺服器端呼叫accept()函式處理請求)。
listen()函式的第乙個引數即為要監聽的socket描述字,第二個引數為相應socket可以排隊的最大連線個數。socket()函式建立的socket預設是乙個主動型別的,listen函式將socket變為被動型別的,等待客戶的連線請求。
connect()函式的第乙個引數即為客戶端的socket描述字,第二引數為伺服器的socket位址,第三個引數為socket位址的長度。
accept()函式:伺服器端呼叫來接收客戶端的連線請求
intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
第乙個引數是伺服器的套接字位址,第二個引數返回客戶端的協議位址,第三個是客戶端協議位址的長度。
accept()函式返回的是乙個全新的socket,代表與返回客戶端的tcp連線。
注意:accept的第乙個引數為伺服器的socket描述字,是伺服器開始呼叫socket()函式生成的,稱為監聽socket描述字;而accept函式返回的是已連線的socket描述字。乙個伺服器通常通常僅僅只建立乙個監聽socket描述字,它在該伺服器的生命週期內一直存在。核心為每個由伺服器程序接受的客戶連線建立了乙個已連線socket描述字,當伺服器完成了對某個客戶的服務,相應的已連線socket描述字就被關閉。
read()、write()等 函式:連線建立完成之後,進行網路i/o操作。
常用的操作函式
原型可以查,推薦recvmsg()和sendmsg()
close()函式:讀寫操作完成之後關閉相應的socket描述字。對應檔案操作的fclose操作。原型: int close(int fd); fd為要關閉的套接字。
close乙個tcp scoket的預設行為是把該socket標記為關閉,然後立即返**用程序,然後該套接字就不能再被程序呼叫了,也就是說不能在作為write或者read函式的第乙個引數。
close操作只是使相應的socket描述字的引用計數-1,只有當引用計數為0時,才會觸發tcp客戶端向伺服器傳送中止連線請求。
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 而不是 ...