Linux下socket程式設計基礎1 初探

2022-09-01 06:06:11 字數 3198 閱讀 6347

int socket(int __domain, int __type, int __protocol);

呼叫socket()返回的描述字存在於協議族空間中,但是沒有乙個具體的位址,所以需要呼叫下面的bind()函式設定具體位址,否則當呼叫connect()、listen()時這個埠系統會隨機分配。

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

ipv4:

struct sockaddr_in ;

/* internet address. */

struct in_addr ;

ipv6:

struct sockaddr_in6 ;

struct in6_addr ;

int listen(int sockfd, int backlog);

服務端通過listen()將socket轉變為被動型別,等待客戶的連線請求

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

客戶端通過呼叫connect()來建立於伺服器的連線

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

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

注意:伺服器通常只需要建立乙個socket套接字,這個套接字在伺服器生命週期內一直存在。而客戶端連線成功服務端後,核心會建立乙個新的已連線的socket套接字,當伺服器對此客戶端完成服務之後,這個socket描述字就會被關閉。

recvmsg()和sendmsg()函式(最通用的i/o函式)

用這兩個函式可替代

#include #include ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

struct msghdr ;

struct iovec

recvmsg 返回的 7 個標誌如下:

示例**

#include #include #include #include #include #include #include #include #include #include using namespace std;

void my_server(void);

struct iovec buffer=;

struct msghdr mymsg=;

//建立套接字

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

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

struct sockaddr_in server_addr;

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

server_addr.sin_family=af_inet; //設定使用ipv4位址

server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//設定具體的ip位址(本地環迴)

server_addr.sin_port=htons(12345); //埠

bind(mysocket,(struct sockaddr *)&server_addr,sizeof(server_addr));//應用 位址和埠的設定

//進入監聽狀態

listen(mysocket,20);

//接收客戶端請求

struct sockaddr_in client_addr;

socklen_t client_addr_size = sizeof(client_addr);

std::cout << "ready accept"sendmsg(client_sock,&mymsg,0); //write(client_sock,str,sizeof(str));用write也是可以的

close(client_sock);

close(mysocket);

}void my_client(void);

struct iovec buffer=;

struct msghdr mymsg=;

int mysocket = socket(af_inet,sock_stream,0);

struct sockaddr_in server_addr;

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

server_addr.sin_family=af_inet;

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

server_addr.sin_port=htons(12345);

connect(mysocket,(struct sockaddr*)&server_addr,sizeof(server_addr));

std::cout << "ready accept message"std::cout << "read message done"<> select;

std::cout << "select:" << select /***cmakelists.txt***/

cmake_minimum_required(version 3.10.2)

project(mysocket)

add_executable(mysocket mysocket.cpp)

linux下socket程式設計

一 什麼是socket socket可以看成是使用者程序與核心網路協議棧的程式設計介面。socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。socket api是一層抽象的網路程式設計介面,適用於各種底層網路協議,如ipv4 ipv6。struct sockaddr in...

linux下socket程式設計

作為乙個嵌入式開發者,在實際的研發專案中,常常需要編寫socket網路程式設計介面,提供給軟體開發人員。下面將提供乙個常用的 模板 客戶端的功能可以用微控制器多功能除錯助手進行驗證 include include include include include include include def...

linux下socket程式設計

簡單的linux下socket程式設計,分別基於tcp和udp協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用 流程 將套接字繫結到伺服器的網路位址上 if bind server sockfd,struct sockaddr my addr,sizeof struc...