顾乔芝士网

持续更新的前后端开发技术栈

linux socket编程指北(socket套接字编程)

linux socket编程指北

以下server和client的c代码均拷贝自博客,详细内容请阅读原文。在其上添加了错误码打印,修改了服务端ip和端口,并增加了makefile脚本。

TCP连接与系统调用(tcp连接和http连接)

一、TCP连接建立与系统调用基础


(一)TCP连接建立过程概述

1. 三次握手

TCP连接建立是基于三次握手机制。首先,客户端向服务器发送一个带有SYN(同步序列号)标志的数据包,请求建立连接。这个数据包中包含了客户端初始的序列号。

linux网络编程Socket之RST详解(linux发送socket请求命令)

产生RST的三个条件:

1. 目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;

2. TCP想取消一个已有的连接;

3. TCP接收到一个根本不存在的连接上的分节;


现在模拟上面的三种情况:

client:

C++网络编程之最简单的服务端和客户端

我们首先来看一个最简单的TCP服务端、客户端的例子,服务端在端口8080等待连接,客户端发起连接,连接成功后发送“Hello,Server”,然后关闭连接;服务端接收客户端的消息并打印,然后关闭连接。

服务端代码:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>

#include <cstring>
#include <iostream>
#include <string>

#define PORT 8080   // 要监听的端口号
#define MAX_CONN 5  // 最大并发连接数

int main() {
  int server_sock, client_sock;
  struct sockaddr_in server_addr, client_addr;
  socklen_t addr_len = sizeof(struct sockaddr_in);
  char buffer[1024];

  // 创建一个套接字
  if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    std::cerr << "Failed to create socket." << std::endl;
    return -1;
  }

  // 设置地址结构
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(PORT);
  server_addr.sin_addr.s_addr = INADDR_ANY;

  // 绑定套接字到指定IP和端口
  if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) <
      0) {
    std::cerr << "Failed to bind socket." << std::endl;
    close(server_sock);
    return -1;
  }

  // 开始监听连接请求
  if (listen(server_sock, MAX_CONN) < 0) {
    std::cerr << "Failed to listen on socket." << std::endl;
    close(server_sock);
    return -1;
  }

  std::cout << "Server is listening on port " << PORT << std::endl;

  while (true) {
    // 接受新的连接请求
    if ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr,
                              &addr_len)) < 0) {
      std::cerr << "Failed to accept connection." << std::endl;
      continue;
    }

    std::cout << "Accepted connection from: " << inet_ntoa(client_addr.sin_addr)
              << ":" << ntohs(client_addr.sin_port) << std::endl;

    // 接收客户端发送的数据
    ssize_t n = recv(client_sock, buffer, sizeof(buffer), 0);
    if (n < 0) {
      std::cerr << "Failed to receive data from client." << std::endl;
      close(client_sock);
      continue;
    }
    buffer[n] = '\0';  // 添加字符串结束符

    std::cout << "Received message: " << buffer << std::endl;

    // 关闭客户端连接
    close(client_sock);
  }

  // 关闭服务器套接字
  close(server_sock);

  return 0;
}

重新认识Socket和socket通信(socket的基本概念和原理)

1、什么是Socket?

Socket通常称为“套接字”,用于描述IP地址和端口,是对TCP/IP 协议的抽象,只对应用层暴露简单的接口,应用程序通过套接字向网络发出请求或者应答请求。如图:

2、Socket如何唯一标识一个进程

一文学会 | linux socket编程——TCP

TCP 是基于连接的数据流的协议,先建立连接再进行通信,而且在通信过程中会检查数据是否发送成功。优点就是保证数据的完整性和准确性,缺点就是效率较低。

漫画C语言 做个聊天软件你不懂也得懂

学完C语言做不出东西?不存在的,咱们做一个最“隐私”的聊天器,就俩人,你和我。咱们聊天的信息你知我知没别人知。



你对网络IO了解多少?别被面试官打败到一个问烂了的知识点上

前言

说起IO,很多人对它应该都有所耳闻,可能很多人对IO都有着一种既熟悉又陌生的感觉,因为IO这一块内容还是比较广泛杂乱的,整个IO的体系也是十分庞大。那么IO到底是个什么东西呢?IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。Java中的IO主要分为文件IO和网络IO两大类,本文博主就与大家一同去网络IO的演进之路上走一遭,看看网络IO到底是如何一步步进化升级的。

<< < 1 2 3 >>
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言