Socket 程式設計

2021-08-09 02:28:44 字數 3686 閱讀 5479

1.1 本地程序通訊

1.2 網路程序通訊

網路之間如何通訊,首先要解決的是如何標識乙個唯一的程序,本地程序可以用pid來標識,但這種方式沒有辦法應用在網路通訊中。tcp/ip協議已經幫我們解決了這個問題,協議中的 ip層可以識別唯一主機,而傳輸層中的「協議+埠」可以識別唯一的應用程式(程序)。也就是說利用(ip,協議,埠)可以標識程序。
socket 起源於unix系統,unix系統有乙個基本的哲學概念——一切皆檔案,也就是說一切東西可以按照檔案模式「開啟—讀、寫—關閉」進行操作。即可以把socket視為一種特殊的檔案進行操作。

3.1基本流程

3.2 socket()函式

int

socket(int domain , int type , int protocol)

socket()函式用於建立乙個socket描述字,用來唯一標識乙個socket。把socket視為一種特殊的檔案的話,那麼socket()相當於建立檔案描述字,用作後續對檔案進行讀寫操作的引數。

socket的三個引數

3.3 bind()函式

int bind(int socket_fd , const

struct sockaddr *addr , socklen_t addrlen )

三個引數

struct sockaddr_in ;
/* internet address. */

struct in_addr ;

ipv6對應的是:
struct sockaddr_in6 ;
struct in6_addr ;
3.4 listen() 、connect()函式作為乙個伺服器,在呼叫socket()、bind()之後就會呼叫listen()來監聽這個socket,如果客戶端這時呼叫connect()發出連線請求,伺服器端就會接收到這個請求。

int

listen(int sockfd, int backlog);

intconnect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

socket()函式建立的socket預設是乙個主動型別的,listen函式將socket變為被動型別的,等待客戶的連線請求。

客戶端通過呼叫connect函式來建立與tcp伺服器的連線。

3.5 accept()函式

客戶端依次呼叫socket()、connect()之後就想tcp伺服器傳送了乙個連線請求。伺服器監聽到這個請求之後,就會呼叫accept()函式取接收請求,這樣連線就建立好了。之後就可以開始網路i/o操作了,即類同於普通檔案的讀寫i/o操作。

int

accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

如果accpet成功,那麼其返回值是由核心自動生成的乙個全新的描述字,代表與返回客戶的tcp連線。

3.6 read() 、write()函式

現在可以對檔案(socket)進行i/o操作了,常用的函式有:

3.7 close()函式

關閉套接字

int

close(int fd)

close乙個tcp socket的預設行為時把該socket標記為以關閉,然後立即返回到呼叫程序。該描述字不能再由呼叫程序使用,也就是說不能再作為read或write的第乙個引數。

注意:close操作只是使相應socket描述字的引用計數-1,只有當引用計數為0的時候,才會觸發tcp客戶端向伺服器傳送終止連線請求。

server.cpp 只是簡單的demo

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define backlog 10

using

namespace

std ;

int main(int argc , char **argv)

close(client_fd) ;

}close(serv_fd) ;

return

0 ;}

client.cpp demo

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define backlog 10

using

namespace

std ;

int main(int argc , char **argv)

client_fd = socket(af_inet , sock_stream , ipproto_tcp) ;

in_addr_t server_ip = inet_addr(argv[1]) ;

memset(&clientaddr , 0 , sizeof(clientaddr) ) ;

clientaddr.sin_family = af_inet ;

clientaddr.sin_port = htons(10001) ;

clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ;

bind(client_fd , (struct sockaddr *)&clientaddr , sizeof(sockaddr) ) ;

memset(&servaddr , 0 , sizeof(servaddr)) ;

servaddr.sin_family = af_inet ;

servaddr.sin_port = htons(10000) ;

servaddr.sin_addr.s_addr = server_ip ;

connect(client_fd , (struct sockaddr *)&servaddr , sizeof(servaddr)) ;

// while(1)

// close(client_fd) ;

return

0 ;}

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 而不是 ...