在Linux中,套接字(socket)是一種用于實現進程間通信(IPC)的機制,它允許不同進程通過網絡進行數據交換。套接字接口是Linux網絡編程的基礎,提供了豐富的API來創建、管理和操作套接字。
以下是一些常用的Linux套接字接口:
int socket(int domain, int type, int protocol);
domain
:地址族,如AF_INET
(IPv4)、AF_INET6
(IPv6)、AF_UNIX
(本地進程間通信)等。type
:套接字類型,如SOCK_STREAM
(面向連接的TCP套接字)、SOCK_DGRAM
(無連接的UDP套接字)等。protocol
:協議號,通常設為0,讓系統自動選擇合適的協議。int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd
:由socket()
函數返回的套接字描述符。addr
:指向要綁定的地址結構體。addrlen
:地址結構體的長度。int listen(int sockfd, int backlog);
sockfd
:監聽套接字描述符。backlog
:等待連接隊列的最大長度。int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd
:監聽套接字描述符。addr
:指向客戶端地址結構體的指針(可選)。addrlen
:客戶端地址結構體的長度(可選)。int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd
:客戶端套接字描述符。addr
:指向目標地址結構體的指針。addrlen
:目標地址結構體的長度。ssize_t send(int sockfd, const void *buf, size_t len, int flags);
sockfd
:套接字描述符。buf
:指向要發送數據的緩沖區。len
:要發送的數據長度。flags
:發送標志,通常設為0。ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sockfd
:套接字描述符。buf
:指向接收數據的緩沖區。len
:緩沖區的長度。flags
:接收標志,通常設為0。int close(int sockfd);
sockfd
:要關閉的套接字描述符。以下是一個簡單的TCP服務器示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
// 創建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 綁定套接字
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 監聽連接
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受連接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收數據
read(new_socket, buffer, 1024);
printf("Message from client: %s\n", buffer);
// 發送響應
send(new_socket, "Hello from server", 18, 0);
// 關閉套接字
close(new_socket);
close(server_fd);
return 0;
}
這個示例展示了如何創建一個簡單的TCP服務器,綁定到本地端口8080,接受一個連接,接收數據并發送響應。
希望這些信息對你有所幫助!如果你有更多問題,請隨時提問。