如何用C在Linux下监听多个端口

如何用C在Linux下监听多个端口,第1张

* File: main.c

* Author: root

*/

#include <stdio.h>

#include <stdlib.h>

#include <sys/time.h>

#include <unistd.h>

#include <fcntl.h>

#include <stdbool.h>

#include "Utility.h"

//多路复用,一个server绑定多个端口,处理多个服务

int main(int argc, char** argv) {

if(argc<3)

{ //参数验证

DieWithUserMessage("param","<timeout(sec.)><port/service>...")

}

long timeout=atol(argv[1])

int noPorts=argc-2

int server_socks[noPorts]

int maxDescriptor=-1

for(int port=0port<noPortsport++)

{

//后面的参数全部是端口,建立socket

server_socks[port]=SetupTCPServerSocket(argv[port+2])

//选择最大的sock描述符

if(server_socks[port]>maxDescriptor)

maxDescriptor=server_socks[port]

Socket通信创建步骤:

(1)通过socket()函数创建socket

(2)通过bind函数绑定socket于设备地址

(3)进行读写 *** 作read/recv/recvfrom write/send/sendto

(4)close方法关闭套接字

例子如下:

test1.c

#include <stdio.h>  

#include <stdlib.h>  

#include <unistd.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

  

int main(void)  

{  

    //create socket  

    int fd = socket(AF_INET, SOCK_DGRAM, 0)  

    if(fd==-1)  

    {  

        perror("socket\n")  

        exit(-1)  

    }  

    printf("socket fd=%d\n",fd)  

  

    //build connection address  

    struct sockaddr_in addr  

    addr.sin_family = AF_INET  

    addr.sin_port = htons(6666)  

    addr.sin_addr.s_addr = inet_addr("127.0.0.1")  

  

    int r  

    r = bind(fd,(struct sockaddr*)&addr,sizeof(addr))  

    if(r==-1)  

    {  

        perror("bind")  

        close(fd)  

        exit(-1)  

    }  

    printf("bind address successful!\n")  

    //accept or send message  

    char buf[255]  

    struct sockaddr_in from  

    socklen_t len  

    len = sizeof(from)  

    while(1)  

    {  

        r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len)  

        if(r>0)  

        {  

            buf[r]=0  

            printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf)  

        }  

        else  

        {  

            break  

        }  

    }  

    //close socket  

    close(fd)  

    return 0  

}

test2.c

#include <stdio.h>  

#include <stdlib.h>  

#include <unistd.h>  

#include <string.h>  

#include <sys/socket.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

  

int main(void)  

{  

    //create socket  

    int fd = socket(AF_INET,SOCK_DGRAM,0)  

    if(fd==-1)  

    {  

        perror("socket")  

        exit(-1)  

    }  

    printf("create socket OK!\n")  

    //create an send address  

    struct sockaddr_in addr={}  

    addr.sin_family = AF_INET  

    addr.sin_port = htons(6666)  

    addr.sin_addr.s_addr=inet_addr("127.0.0.1")  

    //send the message to the specify address  

    int r  

    char buf[255]  

    while(1)  

    {  

        r = read(0,buf,sizeof(buf)-1)  

        if(r<=0)  

            break  

        sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr))  

    }  

    //close socket  

    close(fd)  

    return 0  

}

先运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息

运行结果如下:

[root@raykaeso ~]# netstat -ntlp //查看服务器运行的进程服务和监听端口

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 16725/java

tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2138/mongod

tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 14335/java

tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 859/memcached

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 872/httpd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 873/sshd

tcp6 0 0 :::3306 :::* LISTEN 23443/mysqld

tcp6 0 0 :::11211 :::* LISTEN 859/memcached

tcp6 0 0 :::22 :::* LISTEN 873/sshd

Linux netstat命令是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。使用时如果不带参数,netstat显示活动的 TCP 连接。netstat命令用来打印Linux中网络系统的状态信息最常用的命令之一。

netstat参数:

-a:显示所有连线中的Socket

-A:列出该网络类型连线中的相关地址

-c:持续列出网络状态

-C:显示路由器配置的快取信息

-e:显示网络其他相关信息

-F:显示FIB

-g:显示多重广播功能群组组员名单

-h:在线帮助

-i:显示网络界面信息表单

-l:显示监控中的服务器的Socket

-M:显示伪装的网络连线

-n:直接使用ip地址,而不通过域名服务器

-N:显示网络硬件外围设备的符号连接名称

-o:显示计时器

-p:显示正在使用Socket的程序识别码和程序名称

-r:显示Routing Table

-s:显示网络工作信息统计表

-t:显示TCP传输协议的连线状况

-u:显示UDP传输协议的连线状况

-v:显示指令执行过程

-V:显示版本信息

-w:显示RAW传输协议的连线状况

[root@localhost ~]# netstat -ntlp //查看服务器运行的进程服务和监听端口

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 16725/java

tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2138/mongod

tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 14335/java

tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 859/memcached

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 872/httpd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 873/sshd

tcp6 0 0 :::3306 :::* LISTEN 23443/mysqld

tcp6 0 0 :::11211 :::* LISTEN 859/memcached

tcp6 0 0 :::22 :::* LISTEN 873/sshd


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/6272829.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-19
下一篇2023-03-19

发表评论

登录后才能评论

评论列表(0条)

    保存