laitimes

TCP-based half-duplex network programming practices

author:Coding guys

First of all, let's understand what is half-duplex communication?

Half-duplex data transfer allows data to be transmitted in both directions, but at a certain point, data is only allowed to be transmitted in one direction, it is actually a simplex communication that switches directions.

TCP server code:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <netdb.h>

#include <netinet/in.h>

#include <stdint.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <unistd.h>

#define PORT 8100

/* Print Error Message */

void error()

{

perror("Socket Creation Failed");

exit(EXIT_FAILURE);

}

int main()

{

uint32_t sockfd,conn;

char server_msg[10000],client_msg[10000];

struct sockaddr_in server_addr,client_addr;

/* Create a streaming socket */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

error();

}

/* Server-side binding address and port */

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");

/* Bind socket to server */

if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)

{

error(); /// If binding is unsuccessful

}

/* Listen to the client, the maximum number of listeners, we set it here to 5 */

lists(sockfd, 5);

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

/* When the server finds a new connection request, the server creates a socket descriptor to respond to accept, which is used to send and receive data */

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

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

while (1)

{

bzero(&server_msg, sizeof(server_msg));

bzero(&client_msg, sizeof(client_msg));

/* Send Message */

printf("\nEnter message here: ");

fgets(server_msg, 10000, stdin);

senda (conn, server_msg, strlen (server_msg) + 1, 0);

/* Receive Messages */

recv(conn, client_msg, sizeof(client_msg), 0);

printf("\nClient Message: %s\n", client_msg);

}

/* 关闭socket */

close(sockfd);

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

return 0;

}

Server running status:

TCP-based half-duplex network programming practices

TCP client code:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <netdb.h>

#include <netinet/in.h>

#include <stdint.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <unistd.h>

#define PORT 8100

void error()

{

perror("Socket Creation Failed");

exit(EXIT_FAILURE);

}

int main()

{

uint32_t sockfd;

struct sockaddr_in server_addr;

char serverResponse [10000], clientResponse[10000];

/* Client creates socket */

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 to the server */

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

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

while (1)

{

bzero(&serverResponse, sizeof(serverResponse));

bzero(&clientResponse, sizeof(clientResponse));

/* Receive Messages */

recv(sockfd,serverResponse,sizeof(serverResponse), 0);

printf("\nServer-message:%s\n", serverResponse);

/* Send Message */

printf("\nEnter message here: ");

fgets(clientResponse, 10000, stdin);

send(sockfd, clientResponse, strlen(clientResponse) + 1, 0);

}

/* 关闭socket */

close(sockfd);

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

return 0;

}

Client Running Status:

TCP-based half-duplex network programming practices

Read on