基于TCP的全双工网络编程实践

首先我们先了解一下什么是全双工通信?

全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信相当于是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

TCP服务端代码:

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

#define PORT 10000  

void error()
{
    perror("Socket Creation Failed");
    exit(EXIT_FAILURE);
}

int main()
{
    uint32_t sockfd,conn; 
    char recvbuff[1024],sendbuff[1024]; 

    struct sockaddr_in server_addr,client_addr;  
    socklen_t ClientLen; 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        error();  
    }

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    printf("Server is running...\n");

    int on=1;
    if((setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
    {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

    if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        error(); 
    }

    listen(sockfd, 5);

    printf("Server is listening...\n");

    conn = accept(sockfd, (struct sockaddr *)NULL, NULL);

    printf("Server is connected...\n");

    pid_t pid;
    pid = fork();
    if (pid == 0)  //子进程负责接收数据
    {
        while (1)
        {
            bzero(&recvbuff, sizeof(recvbuff));
            recv(conn, recvbuff, sizeof(recvbuff), 0);
            printf("\nCLIENT : %s\n", recvbuff);
            sleep(5);
        }
    }
    else  //父进程负责发送发送数据
    {
        while (1)
        {
            bzero(&sendbuff, sizeof(sendbuff));
            printf("\nType message here: ");
            fgets(sendbuff, 1024, stdin);
            send(conn, sendbuff, strlen(sendbuff) + 1, 0);
            printf("\nMessage Sent!\n");
            sleep(5);
        }
    }

    close(sockfd);
    printf("Server is offline...\n");
    return 0;
}

TCP服务端运行状态:

TCP客户端代码:

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

#define PORT 10000  

void error()
{
    perror("Socket Creation Failed");
    exit(EXIT_FAILURE);
}

int main()
{
    uint32_t sockfd; 
    char sendbuff[1024],recvbuff[1024]; 

    struct sockaddr_in server_addr; 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        error();
    }

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    printf("Client is running...\n");

    connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    printf("Client is connected...\n");

    pid_t pid;
    pid = fork();
    if (pid == 0)  //子进程
    {
        while (1)
        {
            bzero(&sendbuff, sizeof(sendbuff));
            printf("\nType message here: ");
            fgets(sendbuff, 1024, stdin);
            send(sockfd, sendbuff, strlen(sendbuff) + 1, 0);
            printf("\nMessage sent!\n");
            sleep(5);
        }
    }
    else  //父进程
    {
        while (1)
        {
            bzero(&recvbuff, sizeof(recvbuff));
            recv(sockfd, recvbuff, sizeof(recvbuff), 0);
            printf("\nSERVER: %s\n", recvbuff);
            sleep(5);
        }
    }

    close(sockfd);
    printf("Client is offline...\n");
    return 0;
}

TCP客户端运行状态:

有时候我们会遇到这样的问题,当你第二次第三次......运行程序的时候,报如下的问题:

Socket Creation Failed: Address already in use

解决方法:

    int on=1;
    if((setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
    {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

【欢迎关注编码小哥,学习更多实用的编程方法】

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: .NET TCP全双工是指通过.NET框架中的TCP协议实现的双向通信方式。在这种通信模式下,服务器和客户端可以同时进行数据的传输和接收,在通信的过程中可以实现数据的交互和同步,达到一种高效和准确的通信方式。 在.NET框架中,客户端和服务器实现全双工通信的程序代码非常简单。首先需要创建一个TCPClient对象和TcpListener对象,然后通过TCPClient对象连接到服务器网络端口,进而实现客户端和服务器的连接。在连接成功后,客户端和服务器之间可以通过TCP协议发送和接收数据,实现双向通信。同时客户端和服务器也可以通过流(stream)来进行数据传输,流可以实现数据的读取和写入操作,从而完成数据的传输。 .NET TCP全双工通信方式具有很强的实用性和可靠性,可以适用于各种数据传输场景。例如,可以用于在同步和异步模式下进行触发器操作、Windows服务程序的控制和监控、在线游戏、多媒体资源的传输等方面。通过使用.NET TCP全双工通信方式,可以实现高效、稳定、可靠的数据传输,从而提高了数据通信的效率和准确性。 ### 回答2: .NET TCP全双工是一种网络协议,它允许网络上的各个节点之间进行双向通信。这种通信方式可以同时进行数据的发送和接收,使得网络应用程序可以更加高效地进行数据交互。在.NET框架中,TCP全双工通过Socket类来实现,通过建立连接、发送数据、接收数据等操作来实现数据通信。 对于服务器端来说,TCP全双工可以使其同时处理多个客户端的请求,从而提高服务器的并发处理能力。而对于客户端来说,TCP全双工可以使其以实时的方式接收到服务器端发送的数据,并且可以及时地向服务器端发送反馈信息。 .NET TCP全双工协议在实际应用中被广泛使用,例如在线游戏、即时通讯等领域。在进行网络应用程序开发时,通过使用.NET TCP全双工,可以有效地提高应用程序的及时性和可靠性,从而提高用户的使用体验。 ### 回答3: .NET TCP全双工是指在基于.NET平台的TCP网络编程中,同时支持客户端和服务器端进行双向通信的一种通信方式。在TCP协议中,客户端和服务器端建立的连接是双向的,即可以同时进行收发数据,但是通常情况下是单向的,即一方发送数据,另一方接收数据,并不能同时进行收发数据。 而全双工通信则可以实现客户端和服务器端同时进行收发数据,即可以随时发送和接收数据,而不需要等待对方先发送数据。这样可以大大提高了通信的效率,缩短了通信的延迟时间。 .NET TCP全双工通信需要使用异步编程模型,通过在客户端和服务器端分别创建异步通信的Socket对象,实现双向数据的发送和接收。客户端和服务器端可以通过互相发送“心跳包”来保持TCP连接的有效性,确保数据的可靠传输。 总的来说,.NET TCP全双工通信是高效且可靠的TCP网络通信方式,可以满足对实时交互性和数据传输可靠性要求较高的应用场景,如在线游戏、即时通讯等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编码小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值