您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

通过exec命令打开一个TCP连接

时间:2021-06-21 10:16:31  来源:  作者:追光的Rocky

下面是一个简单的echo服务程序:

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

#define BUFFER_SIZE 1024
#define on_error(...) { fprintf(stderr, __VA_ARGS__); fflush(stderr); exit(1); }

int main(int argc, char *argv[]) {
    if (argc < 2) on_error("Usage: %s [port]n", argv[0]);
    
    int port = atoi(argv[1]);

    int server_fd, client_fd, err;
    struct sockaddr_in server, client;
    char buf[BUFFER_SIZE];

    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) on_error("Could not create socketn");

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = htonl(INADDR_ANY);

    int opt_val = 1;
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);

    err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
    if (err < 0) on_error("Could not bind socket %dn", err);

    err = listen(server_fd, 128);
    if (err < 0) on_error("Could not listen on socketn");

    printf("Server is listening on %dn", port);
    printf("Server IP address is: %sn", inet_ntoa(server.sin_addr));
    printf("Server port is: %dn", (int) ntohs(server.sin_port));

    while (1) {
        socklen_t client_len = sizeof(client);
        client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len); 
        printf("get a connection %dn", client_fd);
        printf("Client IP address is: %sn", inet_ntoa(client.sin_addr));
        printf("Client port is: %dn", (int) ntohs(client.sin_port));

        if (client_fd < 0) on_error("Could not establish new connectionn");

        while (1) {
            int read = recv(client_fd, buf, BUFFER_SIZE, 0);

            if (!read) break; // done reading
            if (read < 0) on_error("Client read failedn");

            printf("server received %d bytes: %s", read, buf);

            err = send(client_fd, buf, read, 0);
            if (err < 0) on_error("Client write failedn");
        }

    }

    return 0;
}

编译之后运行:

[root@localhost opt]# ./a.out 12345
Server is listening on 12345
Server IP address is: 0.0.0.0
Server port is: 12345

然后一般通过telnet的方式来连接测试:

$ telnet localhost 12345

还有一种测试方式,就是通过exec命令来打开一个tcp连接:

[root@localhost dev]# exec 6<>/dev/tcp/localhost/12345

执行上面的命令后,echo服务程序的日志输出:

get a connection 4
Client IP address is: 127.0.0.1
Client port is: 46476

通过netstat命令查看TCP连接情况:

[root@localhost ~]# netstat -aonp|grep 12345
tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN      2511/./a.out         off (0.00/0/0)
tcp        0      0 127.0.0.1:46476         127.0.0.1:12345         ESTABLISHED 1335/-bash           off (0.00/0/0)
tcp        0      0 127.0.0.1:12345         127.0.0.1:46476         ESTABLISHED 2511/./a.out         off (0.00/0/0)

可以看到连接已经建立。

通过下面的命令,进行写数据:

[root@localhost dev]# echo "Write this to the socket" >&6

echo服务程序打印日志如下:

server received 25 bytes: Write this to the socket


Tags:exec命令   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
下面是一个简单的echo服务程序:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include...【详细内容】
2021-06-21  Tags: exec命令  点击:(116)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(0)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(9)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find &ndash;name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(18)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(14)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(14)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(22)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(28)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(26)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条