TCP+IPv6 客户端 & 服务端 程序简例

97 篇文章 7 订阅
30 篇文章 1 订阅

TCP+IPv6 客户端 & 服务端 程序简例

本文给出基于IPv6的TCP客户端以及服务端程序样例。

可以参考《TCP+IPv4 客户端 & 服务端 程序简例》进行对比。

服务端:

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

#define BACKLOG 16

int listen_fd = -1;

void sigINT(int signo);

int main()
{
    if (signal(SIGINT, sigINT) == SIG_ERR)
    {
        printf("set signal handler(SIGINT) error!!!\n");
        exit(1);
    }

    // socket
    if ( (listen_fd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 )
    {
        printf("create socket error=%d(%s)!!!\n", errno, strerror(errno));
        exit(1);
    }

    // bind
    struct sockaddr_in6 server_addr;
    server_addr.sin6_family = AF_INET6; // IPv4
    server_addr.sin6_port = htons(12500); // Port
    server_addr.sin6_addr = in6addr_any; // IP
    if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        printf("socket bind error=%d(%s)!!!\n", errno, strerror(errno));
        exit(1);
    }

    // listen
    if (listen(listen_fd, BACKLOG) < 0)
    {
        printf("socket listen error=%d(%s)!!!\n", errno, strerror(errno));
        exit(1);
    }

    printf("server init ok, start to accept new connect...\n");

    while (1)
    {
        // accept
        int client_fd = accept(listen_fd, NULL, NULL);
        if (client_fd < 0)
        {
            printf("socket accept error=%d(%s)!!!\n", errno, strerror(errno));
            exit(1);
        }
        printf("accept one new connect(%d)!!!\n", client_fd);

        static const char *msg = "Hello, Client!\n";
        if (write(client_fd, msg, strlen(msg)) != strlen(msg))
        {
            printf("send msg to client error!!!\n");
        }
        close(client_fd);
    }
}

void sigINT(int signo)
{
    printf("catch SIGINT, quit...\n");
    close(listen_fd);
    exit(0);
}

客户端:

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

int main()
{
    int client_fd = socket(AF_INET6, SOCK_STREAM, 0);
    if (client_fd < 0)
    {
        printf("create socket error=%d(%s)!!!\n", errno, strerror(errno));
        exit(1);
    }

    struct sockaddr_in6 server_addr;
    server_addr.sin6_family = AF_INET6;
    server_addr.sin6_port = htons(12500);
    if (inet_pton(AF_INET6, "::1", &server_addr.sin6_addr) <= 0)
    {
        printf("inet_pton error!!!\n");
        exit(1);
    }

    if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        printf("socket connect error=%d(%s)!!!\n", errno, strerror(errno));
        exit(1);
    }
    printf("connect to server ok!\n");

    char msg[1024];
    int rbytes = -1;
    while ( (rbytes = read(client_fd, msg, sizeof(msg)-1)) > 0)
    {
        msg[rbytes] = 0; // null terminate
        printf("%s\n", msg);
    }
    if (rbytes < 0)
    {
        printf("read error=%d(%s)!!!\n", errno, strerror(errno));
    }
    exit(0);
}

服务端:编译 && 运行

[jiang@localhost 0406]$ gcc -o server server.c
[jiang@localhost 0406]$ ./server 
server init ok, start to accept new connect...
accept one new connect(4)!!!
accept one new connect(4)!!!
accept one new connect(4)!!!
^Ccatch SIGINT, quit...

客户端:编译 && 运行

[jiang@localhost 0406]$ gcc -o client client.c
[jiang@localhost 0406]$ ./client 
connect to server ok!
Hello, Client!

[jiang@localhost 0406]$ ./client 
connect to server ok!
Hello, Client!

[jiang@localhost 0406]$ ./client 
connect to server ok!
Hello, Client!
### 回答1: TCP/IP是一种通信协议,它包含了客户端服务端两个角色。客户端服务端通过TCP/IP协议进行通信,实现数据的传输和交互。 客户端是指发起连接请求的一方。当客户端需要与服务端进行通信时,它会首先向服务端发起连接请求。客户端在发送请求时,需要提供服务端的地址和端口号。一旦连接建立成功,客户端可以通过发送请求报文来向服务端发送数据请求。客户端还可以接收服务端响应的数据,以便进行后续处理。在数据传输结束后,客户端可以选择关闭连接,释放资源。 服务端是指接收并处理连接请求的一方。服务端监听指定的端口,并等待客户端的连接请求。当服务端接收到连接请求后,会建立一个与客户端的连接。一旦连接建立,服务端可以接收客户端发送的请求数据,并进行相应的处理。处理完成后,服务端会生成响应数据,并发送给客户端服务端客户端可以通过多次的请求响应交互来进行数据的传输和处理。最后,服务端可以主动关闭连接,释放资源。 TCP/IP客户端服务端之间的通信具有可靠性和顺序性。TCP协议保证了数据传输的可靠性,即在传输过程中不会丢失数据或产生错乱。而IP协议则负责将数据包传输到目标地址。客户端服务端之间的通信是基于可靠的连接进行的,通过TCP协议进行数据传输。数据按照顺序在客户端服务端之间传输,确保了数据的有效性和完整性。 总之,TCP/IP客户端服务端通过可靠的连接和顺序传输实现数据的交互和传输。这种通信方式在互联网上广泛应用,例如浏览器与服务器之间的通信、远程登录等。 ### 回答2: TCP/IP客户端服务端是指在TCP/IP网络中进行通信的两个角色。TCP/IP是互联网所使用的通信协议,它提供了可靠的、无连接的通信。 客户端是指请求并接收服务的一方。客户端通常由应用程序或者用户发起,它向服务器发起请求,并等待服务器的响应。客户端主动与服务器建立连接,并发送请求报文给服务器。在建立连接后,客户端可以将请求数据发送给服务器,并等待服务器的响应。客户端可以是个人电脑、手机、平板电脑等设备,通过应用程序服务端进行通信。 服务端是指提供服务的一方。服务端运行在服务器上,并等待客户端的连接请求。一旦接收到客户端的请求,服务端会根据请求内容进行相应的处理,并将处理结果返回给客户端服务端可以是网络服务器、数据库服务器、邮件服务器等,它通过应用程序接收和处理客户端请求,并返回相应的结果给客户端TCP/IP客户端服务端之间的通信过程分为三个阶段:建立连接阶段、数据传输阶段和连接关闭阶段。在建立连接阶段,客户端发起连接请求,服务端接受请求并与客户端建立连接。在数据传输阶段,客户端可以将需要发送的数据通过连接发送给服务端服务端接收并处理数据,并将处理结果返回给客户端。在连接关闭阶段,客户端服务端可以选择关闭连接,结束通信。 总之,TCP/IP客户端服务端是互联网通信的两个主要角色,客户端发起请求并接收服务,而服务端接受请求并提供相应的服务。通过TCP/IP协议,客户端服务端可以进行可靠的、无连接的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值