[C++ LAN communication] socket realizes communication (text, voice)

Common communication methods include text and voice, and the following is implemented in C++:

reference:

https://blog.csdn.net/Robot_hfut/article/details/102862052
https://blog.csdn.net/Ephemeroptera/article/details/100190973
https://blog.csdn.net/weixin_47232366/article/details/117520656

text communication

Communication between Windows and Linux via text:

client.cpp(windows)

// windows客户端
#include <stdio.h>
#include <Windows.h>

#pragma comment(lib, "ws2_32.lib")
#define Port 5000
#define IP_ADDRESS "10.10.4.232"

int main(int argc, char* argv[])
{
    
    
	// 存储调用AfxSocketInit全局函数返回的Windows Sockets初始化信息
	WSADATA s; 
	SOCKET ClientSocket;
	struct sockaddr_in ClientAddr; // 一个sockaddr_in型的结构体对象
	int ret = 0;
	char SendBuffer[MAX_PATH];   // Windows的MAX_PATH默认是260

	// 初始化Windows Socket
	// WSAStartup函数对Winsock服务的初始化
	if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通过连接两个给定的无符号参数,首个参数为低字节
	{
    
    
		printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
		getchar();
		return -1;
	}

	while (1)
	{
    
    
		// 创建一个套接口
		// 如果这样一个套接口用connect()与一个指定端口连接
		// 则可用send()和recv()与该端口进行数据报的发送与接收
		// 当会话结束后,调用closesocket()
		ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
			SOCK_STREAM, // 新套接口的类型描述
			IPPROTO_TCP); // 套接口所用的协议
		if (ClientSocket == INVALID_SOCKET)
		{
    
    
			printf("Create Socket Failed! Error: %d\n", GetLastError());
			getchar();
			return -1;
		}

		ClientAddr.sin_family = AF_INET;
		ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); // 定义IP地址
		ClientAddr.sin_port = htons(Port); // 将主机的无符号短整形数转换成网络字节顺序
		memset(ClientAddr.sin_zero, 0X00, 8); // 函数通常为新申请的内存做初始化工作

		// 连接Socket
		ret = connect(ClientSocket,
			(struct sockaddr*)&ClientAddr,
			sizeof(ClientAddr));
		if (ret == SOCKET_ERROR)
		{
    
    
			printf("Socket Connect Failed! Error:%d\n", GetLastError());
			getchar();
			return -1;
		}
		else
		{
    
    
			printf("Socket Connect Succeed!");
		}

		printf("Input Text: ");
		while (1)
		{
    
    
			scanf("%s", &SendBuffer);

			// 发送数据至服务器
			ret = send(ClientSocket,
				SendBuffer,
				(int)strlen(SendBuffer), // 返回发送缓冲区数据长度
				0);

			if (ret == SOCKET_ERROR)
			{
    
    
				printf("Send Information Failed! Error:%d\n", GetLastError());
				getchar();
				break;
			}

			break;
		}

		// 关闭socket
		closesocket(ClientSocket);
		if (SendBuffer[0] == 'q') // 设定输入第一个字符为q时退出
		{
    
    
			printf("Quit!\n");
			break;
		}

	}
	WSACleanup();
	getchar();
	return 0;
}

server.cpp(Linux)

// Linux服务端
#include <unistd.h>
#include <stdio.h>
#include <x86_64-linux-gnu/sys/socket.h>
#include <netinet/in.h>
#include <x86_64-linux-gnu/sys/types.h>
#include <stdlib.h>
#include <string.h>

#define SERVER_PORT 5000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 10

int main(int argc,char* argv[])
{
    
    
    struct sockaddr_in server_addr;
    int server_socket;
    int opt = 1;

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);  
    // server初始化
    server_socket = socket(PF_INET, SOCK_STREAM, 0);

    if (server_socket < 0)
    {
    
    
        printf("Create Socket Failed!\n");
        exit(1);
    }


    // 绑定端口
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
    
    
        printf("Server Bind Port: %d Failed!\n", SERVER_PORT);
        exit(1);
    }

    // 监听端口
    if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
    
    
        printf("Server Listen Failed!\n");
        exit(1);
    }      

    while(1)
    {
    
    
        struct sockaddr_in client_addr;
        int client_socket;
        socklen_t length;
        char Buffer[BUFFER_SIZE];

        // 接收客户端消息
        length = sizeof(client_addr);
        client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
        if (client_socket < 0)
        {
    
    
            printf("Server Accept Failed!\n");
            break;
        }

        while(1)
        {
    
    
            bzero(Buffer, BUFFER_SIZE);
            length = recv(client_socket, Buffer, BUFFER_SIZE, 0);
            if (length < 0)
            {
    
    
                printf("Server Recieve Data Failed!\n");
                break;
            }           

            if ('q' == Buffer[0])
            {
    
    
                printf("Quit!\n");
                break;
            }

            printf("%s\n", Buffer);
            break;
        }

        close(client_socket);
    }

    close(server_socket);
    return 0;
}

The effect is as follows:

insert image description here

voice communication

Voice communication between Windows, that is, a server is opened on the Windows side, and many clients can be opened to realize the communication between the clients.

that's all.

Guess you like

Origin blog.csdn.net/qq_40344790/article/details/130091132