日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

windows多客戶端與liunx-ubuntu服務(wù)端進行通信

作者:z_tt123456789 更新時間: 2022-07-18 編程語言

windows多客戶端與liunx-ubuntu服務(wù)端進行通信

liunx服務(wù)端:

#include <stdio.h>
#include <netinet/in.h>
#include <pthread.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <cstdlib>
#include <string>
#include <iostream>


#define MAXLINE 80
#define SERV_PORT 8000

//編譯的時候 因為thread不是內(nèi)置的  要加上gcc main.c -o test -lpthread 
struct s_info {
        struct sockaddr_in cliaddr;
        int connfd;
};
void *do_work(void *arg)
{
        int n,i;
        struct s_info *ts = (struct s_info*)arg;
        char buf[MAXLINE];//在線程自己的用戶空間棧開辟的,該線程運行結(jié)束的時候,主
控線程就不能操作這塊內(nèi)存了
        char str[INET_ADDRSTRLEN];//INET_ADDRSTRLEN 是宏16個字節(jié)

//在創(chuàng)建線程前設(shè)置線程創(chuàng)建屬性,設(shè)為分離態(tài),效率高
        pthread_detach(pthread_self());

        while (1) {
        n = read(ts->connfd, buf, MAXLINE);
        if (n == 0) {
                printf("the other side has been closed.\n");
                break;
                }
        printf("received from %s at PORT %d\n",
        inet_ntop(AF_INET, &(*ts).cliaddr.sin_addr, str, sizeof(str)),ntohs((*ts).cliaddr.sin_port));

        for (i = 0; i < n; i++)
            buf[i] = toupper(buf[i]);
        write(ts->connfd, buf, n);
        }
        close(ts->connfd);
}
int main(void)
{
        struct sockaddr_in servaddr, cliaddr;
        socklen_t cliaddr_len;
        int listenfd, connfd;
        int i = 0;
        pthread_t tid;
        struct s_info ts[3497];

        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERV_PORT);

        bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
        listen(listenfd, 20);

        printf("Accepting connections ...\n");
        while (1) {
                cliaddr_len = sizeof(cliaddr);
                connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
                ts[i].cliaddr = cliaddr;
                ts[i].connfd = connfd;
/* 達到線程最大數(shù)時,pthread_create出錯處理, 增加服務(wù)器穩(wěn)定性 */
                pthread_create(&tid, NULL, do_work, (void*)&ts[i]);//把accept得>到的客戶端信息傳給線程,讓線程去和客戶端進行數(shù)據(jù)的收發(fā)
                i++;
        }
return 0;
}

windows客戶端---在vs2017上面運行多個客戶端連接同一個服務(wù)端通信

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define Port 8000//8866  8866單項連接 和服務(wù)端通信 server 互相通信
#define IP_ADDRESS "192.168.223.128"     //服務(wù)器地址 在服務(wù)端通過ifconfig -a查看服務(wù)端的ip地址

#define MaxBufSize 1024

//監(jiān)聽服務(wù)器消息
DWORD WINAPI recvFromServer(LPVOID lpParam)
{
	char buf[MaxBufSize];
	SOCKET *ClientSocket = (SOCKET*)lpParam;
	while (1)
	{
		memset(buf, '\0', sizeof(buf));
		if (recv(*ClientSocket, buf, 1024, 0) <= 0)
		{
			printf("close\n");
			break;
			closesocket(*ClientSocket);
		}
		printf("%s\n", buf);
	}
	return 0;
}


int main() // argc是命令行總的參數(shù)個數(shù)
{	
	WSADATA s; // 用來儲存調(diào)用AfxSocketInit全局函數(shù)返回的Windows Sockets初始化信息
	SOCKET ClientSocket;
	struct sockaddr_in ClientAddr; // 一個sockaddr_in型的結(jié)構(gòu)體對象
	int ret = 0;
	char SendBuffer[MAX_PATH]; // Windows的MAX_PATH默認是260

	// 初始化Windows Socket
	// WSAStartup函數(shù)對Winsock服務(wù)的初始化
	if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通過連接兩個給定的無符號參數(shù),首個參數(shù)為低字節(jié)
	{
		printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
		getchar();
		return -1;
	}
	while (1)
	{
		// 創(chuàng)建一個套接口
		// 如果這樣一個套接口用connect()與一個指定端口連接
		// 則可用send()和recv()與該端口進行數(shù)據(jù)報的發(fā)送與接收
		// 當會話結(jié)束后,調(diào)用closesocket()
		ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
			SOCK_STREAM, // 新套接口的類型描述
			IPPROTO_TCP); // 套接口所用的協(xié)議
		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); // 將主機的無符號短整形數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序
		memset(ClientAddr.sin_zero, 0X00, 8); // 函數(shù)通常為新申請的內(nèi)存做初始化工作
		// 連接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 Data: ");
		//創(chuàng)建線程  發(fā)送消息
		//CreateThread(NULL, 0, &recvFromServer, &ClientSocket, 0, NULL);
		//char info[1024], SendBuffer[MaxBufSize], RecvBuff[MaxBufSize];
		
		while (1)
		{//多客戶端和服務(wù)端通信   服務(wù)端為dserver
			scanf("%s", &SendBuffer);
			send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
			int recvLen = recv(ClientSocket, SendBuffer, MaxBufSize, 0);
			if(recvLen == 0) printf("Message form server:\n");
			else printf("Message form server: %s\n", SendBuffer);
			// 發(fā)送數(shù)據(jù)至服務(wù)器
			//ret = send(ClientSocket,
			//	SendBuffer,
			//	(int)strlen(SendBuffer), // 返回發(fā)送緩沖區(qū)數(shù)據(jù)長度
			//	0);
			//if (ret == SOCKET_ERROR)
			//{
			//	printf("Send Information Failed! Error:%d\n", GetLastError());
			//	getchar();
			//	break;
			//}
			接收服務(wù)端發(fā)的消息
			//char bufRecv[MaxBufSize] = { 0 };
			//int recvLen = recv(ClientSocket, bufRecv, MaxBufSize, 0);
			//printf("Message form server: %s\n", bufRecv);
			Sleep(500);
			memset(RecvBuff, 0, sizeof(RecvBuff));
			break;
		}
		// 關(guān)閉socket
		closesocket(ClientSocket);
		if (SendBuffer[0] == 'q') // 設(shè)定輸入第一個字符為q時退出
		{
			printf("Quit!\n");
			break;
		}
	}
	WSACleanup();
	getchar();
	system("pause");
	return 0;
}

原文鏈接:https://blog.csdn.net/z_tt123456789/article/details/108383794

欄目分類
最近更新