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...