首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 监听socket端口号

基础概念

在Linux系统中,监听Socket端口号是指服务器程序在特定的网络端口上等待客户端的连接请求。Socket是网络通信的基本构建块,它允许不同计算机上的应用程序通过互联网进行通信。端口号是一个16位的数字,用于标识特定的网络服务。

相关优势

  1. 资源复用:通过监听同一个端口,可以处理多个客户端的连接请求。
  2. 简化编程:使用Socket API可以简化网络编程的复杂性。
  3. 跨平台:Socket编程在大多数操作系统上都支持,具有良好的跨平台性。

类型

  1. TCP Socket:传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
  2. UDP Socket:用户数据报协议(UDP)是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

应用场景

  • Web服务器:如Apache、Nginx等,通常监听80(HTTP)和443(HTTPS)端口。
  • 数据库服务器:如MySQL、PostgreSQL等,通常监听3306、5432等端口。
  • 邮件服务器:如SMTP服务器监听25端口,POP3服务器监听110端口。

示例代码

以下是一个简单的TCP服务器示例,使用C语言编写,监听端口8080:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define BUF_SIZE 1024

int main(int argc, char *argv[]) {
    int serv_sock, clnt_sock;
    char buf[BUF_SIZE];
    int str_len;

    struct sockaddr_in serv_addr, clnt_addr;
    socklen_t clnt_addr_size;

    if (argc != 2) {
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1) {
        perror("socket() error");
        exit(1);
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) {
        perror("bind() error");
        exit(1);
    }

    if (listen(serv_sock, 5) == -1) {
        perror("listen() error");
        exit(1);
    }

    clnt_addr_size = sizeof(clnt_addr);

    clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
    if (clnt_sock == -1) {
        perror("accept() error");
        exit(1);
    }

    while ((str_len = read(clnt_sock, buf, BUF_SIZE)) != 0) {
        write(clnt_sock, buf, str_len);
    }

    close(clnt_sock);
    close(serv_sock);

    return 0;
}

遇到的问题及解决方法

问题:端口已被占用

原因:另一个进程已经在使用该端口。

解决方法

  1. 使用netstat -tulnss -tuln命令查看哪个进程占用了该端口。
  2. 使用kill -9 <PID>命令终止占用端口的进程。
  3. 更改服务器程序监听的端口号。

问题:权限不足

原因:监听1024以下的端口需要root权限。

解决方法

  1. 使用sudo命令以root权限运行服务器程序。
  2. 更改服务器程序监听的端口号为1024以上。

参考链接

通过以上信息,您可以更好地理解Linux中监听Socket端口号的基础概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【Linux】认识协议、MacIP地址和端口号、网络字节序、socket套接字

    在Linux中,这一层通常与特定的网络接口卡(NIC)驱动程序相关联。 网络层:提供IP地址管理和路由功能,确保数据包能够正确地从一个网络传输到另一个网络。...Linux支持IPv4和IPv6两种IP协议版本。 传输层:提供端到端的通信服务,确保数据的可靠传输或快速、不可靠的传输。...另外,一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。 网络通信的本质,也是进程间通信,本质是两个互联网进程代表人来进行通信。IP + port 叫做套接字socket。...); // 开始监听 socket (TCP, 服务器) int listen(int socket, int backlog); // 接收请求 (TCP, 服务器) int accept(int...服务器也不是必须调用 bind(),但如果服务器不调用 bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦 sockaddr结构: sock

    10010

    没有IP和端口号,可以进行socket通信吗?

    在使用socket通信时,无论是本机内部通信,还是两台机器通信,也无论是TCP的方式,还是UDP的方式,一般都要指定IP和端口号。...在Linux开发中,如果是同一台设备内部通信,也可以不需要IP和端口号,这就是Unix域socket通信,它实际上是通过文件的方式实现通信,从而不再需要IP和端口号。...1 Unix域socket基础知识 在使用IP和端口号的socket通信中,会用到sockaddr和sockaddr_in结构体,两个结构体一样大,都是16个字节,而且都有family属性,不同的是:...方式的socket通信模型,因为TCP是有连接的,作为服务端,需要先创建一个socket,然后绑定到要接收消息的地址上,接下来就是监听TCP客户端的连接,等客户端来连接后,就可以使用recv或read来接收消息了...的TCP服务端程序的流程: 创建socket bind到指定的地址(文件) listen监听TCP客户端的连接请求 accept接受TCP客户端的连接 recv/read接收TCP客户端的消息 2.3

    1.7K20

    【Linux】:Socket编程 TCP

    )设置为监听状态,以接受客户端的连接请求。...它通常在 socket、bind 和 listen 之后调用,用于从监听队列中取出一个客户端连接,并创建一个新的套接字用于与客户端通信。...); 参数说明 sockfd: 这是一个监听套接字描述符(socket file descriptor),通常由 socket 创建并通过 bind 和 listen 设置为监听状态。...addr: 这是一个指向 struct sockaddr 的指针,用于存储客户端的地址信息(如 IP 地址和端口号)。 如果不需要客户端的地址信息,可以将其设置为 NULL。...EchoServer -- 线程池 引入我们之前写的【Linux】:线程库 Thread.hpp 简单封装 Thread.hpp 以及 单例模式下的【Linux】:日志策略 + 线程池(单例模式 Threadpool.hpp

    8710

    【Linux】Socket编程—TCP

    TCP socket API 详解   下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...socket() 作用:打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描述符; 应用程序可以像读写文件一样用 read/write 在网络上收发数据; 返回值:如果 socket...bind() 介绍:服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接; 服务器需要调用 bind 绑定一个固定的网络地址和端口号;...作用:将参数 sockfd 和 myaddr 绑定在一起, 使 sockfd 这个用于网络通讯的文件描述符监听 myaddr 所描述的地址和端口号; 参数: 前面讲过,struct sockaddr...端口号为 SERV_PORT, 我们定义为 8080; listen() 介绍:listen()声明 sockfd 处于监听状态, 并且最多允许有 backlog 个客户端处于连接 等待状态, 如果接收到更多的连接请求就忽略

    8810

    linux下socket编程

    char sa_data[14]; // 14字节的协议地址 } 说明,其中sa_family一般为AF_INET,代表tcp/ip协议族,sa_data则包含该socket的IP地址和端口号 struct...函数返回的socket描述符     serv_addr: 包含远端主机ip地址和端口号的指针        addrlen: 为远端地址结构的长度, sizeof(sockaddr)     connect...函数只用于面向连接的客户端程式,无连接和面向连接的服务器不需要,成功则返回0,失败返回-1     listen函数使socket处于被动的监听模式,并为该socket模式建立一个输入数据队列,将到达的服务请求保存在队列中...在建立好输入队列后,服务器调用accept函数,然后睡眠并等待客户端的连接唤醒 int accept(int sockfd, void *addr, int *addrlen)     sockfd:是被监听的...收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍能够继续在以前的 socket上监听,同时能够在新的

    4K70

    Linux Socket 收发Json

    如果对你有帮助,麻烦点个在看或点个赞,感谢~ 不管是Qt开发还是linux 嵌入式应用开发,一个人的核心竞争力还是不断思考,也就是不断琢磨。...下面的程序主要是Linux C Socket 读取JSON文件并传输,然后再写入文件,其中使用了cJSON库,关于cJSON库不过多介绍,主要介绍整体的思路。 1....Server 端 使用的是socket 阻塞式,没有使用select、poll、epoll等 接收端按照JSON格式解析数据,并提取感兴趣Key所对应的Value 程序功能挺快就可以做好,做完之后进行拆解...,将socket通信独立出来,JSON解析、写文件、响应客户端JSON数据等分别写成函数。...小结 编译JSON时需要链接linux的数学库 自己琢磨如何拆解函数功能 应用程序也主要是调用别人的api,那么你的核心竞争力是什么呢 ? 如需程序工程可在公众号后台留言。

    4.7K20

    Linux系统下socket编程socket接口介绍(二)

    前言 在上一篇文章里面我们介绍了TCP的三次握手和四次挥手过程的介绍以及网络编程里面的一些api接口函数的介绍——Linux系统下socket编程之socket接口介绍(一)。...函数介绍 - 发送和接收 - (1)send和write: 首先说明的一点,之前介绍的socket这个函数,非常类似我们之前介绍的open函数,他们都会返回一下文件描述符;所以这里的send函数和write...函数作用类似,我们用man手册来查看它的具体形式和用法: #include #include socket.h> ssize_t send(int...(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序,这两个函数先不讲,实战遇到的话,再进行解析),具体可以看下面Linux的源文: inet_aton...(2)struct sockaddr,这个结构体是linux的网络编程接口中用来表示IP地址的 标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。

    3.8K20

    linux udp编程_linux中socket编程

    在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...当然,在我们服务端创建socket后,主动往外发送一个数据,这样即使我们不进行绑定,我们依然可以收到数据,这只是系统通过我们的发送,自动的绑定了一个端口,这个并不是我们想要的,实际的使用中,也并不推荐这种方式...后,配置一下套接字,允许进行发送广播消息,上代码 int set_broadcast = 1; setsockopt(socket, SOL_SOCKET, SO_BROADCAST, &set_broadcast...解决方法如下:(允许端口重用) int on = 1; ret = setsockopt(udp_net_sta.socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,在创建完socket后,有一个bind的操作

    11.1K10
    领券