ZBLOG

还有一个套接字呢

是的,套接字(Socket)也是一种重要的进程间通信方式,尤其是在网络编程中。它可以用于同一台机器上的进程之间的通信,也可以用于不同机器上的进程之间的通信。以下是关于套接字的一些详细信息:

套接字 (Socket)

1. 定义

套接字是一种支持 TCP/IP 网络协议的数据交换机制。通过创建套接字,程序可以发送和接收数据,这使得不同主机或同一主机上不同进程之间能够进行通信。

2. 类型

  • 流套接字 (TCP Socket):提供可靠、面向连接的双向数据流。
  • 数据报套接字 (UDP Socket):提供不可靠、无连接的数据报服务。

3. 实现

使用 C/C++ 编写一个简单的 TCP 套接字服务器和客户端示例:

TCP 服务器示例
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    
    // 创建 socket 文件描述符
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    
    // 设置选项以重用地址
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
    
    // 定义地址结构
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY; 
    address.sin_port = htons(8080); 
    
    // 绑定 socket 到端口
    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    
    // 开始监听
    listen(server_fd, 3);
    
    // 接受新的连接
    new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
    
    char buffer[1024] = {0};
    
    // 读取客户端消息并发送响应
    read(new_socket , buffer, 1024);
    std::cout << "Message from client: " << buffer << std::endl;
    
    const char *hello = "Hello from server";
    send(new_socket , hello , strlen(hello) , 0 );
    
    close(new_socket);
    close(server_fd);
    
   return 0;
}
TCP 客户端示例
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> 
#include <unistd.h>

int main() {
   int sock = 0; 
   struct sockaddr_in serv_addr; 
   
   // 创建 socket 文件描述符
   sock = socket(AF_INET, SOCK_STREAM, 0);
   
   serv_addr.sin_family = AF_INET; 
   serv_addr.sin_port = htons(8080); 

   // 将 IPv4 和 IPv6 地址转化为数字形式 
   inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); 

   connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); 

   const char *message = "Hello from client"; 
   send(sock , message , strlen(message) , 0 ); 

   char buffer[1024] = {0}; 
   read(sock , buffer , 1024); 
   
   std::cout << "Message from server: " << buffer << std::endl;

   close(sock); 

   return 0;  
}

总结

  • 优点

    • 套接字支持远程和本地进程间通信,是一种非常灵活且广泛应用的方法。
    • 可以轻松扩展到分布式系统中。
  • 缺点

    • 相比其他 IPC 方法(如共享内存),套接字的性能可能较低,因为需要经过网络栈处理。

总之,选择合适的 IPC 方法要根据具体场景考虑,例如所需性能、数据量及复杂性等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=5479

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?