进程间通信(Inter-Process Communication, IPC)是指在不同进程之间传递数据和信息的机制。在Unix/Linux等操作系统中,socket是一种常用的IPC方式,可以用于同一台机器上的进程间通信,也可以用于不同机器上的网络通信。
Socket的基本概念
Socket定义:Socket是一个抽象概念,它代表了一个端点,通过这个端点,进程可以发送和接收数据。每个Socket都与一个协议族(如TCP/IP)和一个地址相关联。
套接字类型:
- 流式套接字(SOCK_STREAM):用于提供面向连接的、可靠的字节流服务,通常基于TCP协议。
- 数据报套接字(SOCK_DGRAM):用于提供无连接、不可靠的数据报服务,通常基于UDP协议。
使用流程:
- 创建Socket:使用
socket()
系统调用来创建一个新的Socket。 - 绑定(Bind):对于服务器端,需要将Socket绑定到本地地址和端口号。
- 监听(Listen):服务器端Socket需要监听来自客户端的连接请求。
- 接受连接(Accept):服务器使用
accept()
函数接受连接请求,并返回新的Socket以进行后续通信。 - 连接(Connect):客户端使用
connect()
函数与服务器建立连接。 - 数据传输:一旦建立连接,可以使用
send()
和recv()
进行数据传输。 - 关闭Socket:通信结束后,应当使用
close()
函数关闭Socket以释放资源。
- 创建Socket:使用
使用示例
以下是一个简单的TCP Socket服务器和客户端示例:
服务器代码 (C语言)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
// 创建socket
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(PORT);
// 绑定
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
// 监听
listen(server_fd, 3);
// 接受连接
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
// 数据处理
read(new_socket, buffer, 1024);
printf("Received: %s\n", buffer);
const char *response = "Hello from server";
send(new_socket , response , strlen(response) , 0 );
close(new_socket);
return 0;
}
客户端代码 (C语言)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 转换IPv4地址从文本到二进制形式
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
const char *message = "Hello from client";
send(sock , message , strlen(message) , 0 );
char buffer[1024] = {0};
read(sock , buffer , 1024);
printf("Received: %s\n", buffer);
close(sock);
return 0;
}
总结
通过Sockets,进程能够在网络上或同一台计算机上进行有效的数据交换。理解Sockets及其工作原理对开发网络应用程序至关重要。
内容由零声教学AI助手提供,问题来源于学员提问