網(wǎng)站首頁 編程語言 正文
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
相關(guān)推薦
- 2022-12-29 React動態(tài)更改html標簽的實現(xiàn)方式_React
- 2022-07-28 docker容器間進行數(shù)據(jù)共享的三種實現(xiàn)方式_docker
- 2022-06-17 Go語言讀取,設(shè)置Cookie及設(shè)置cookie過期方法詳解_Golang
- 2022-04-08 Swift實現(xiàn)簡單計算器_Swift
- 2022-04-12 jieba.posseg.cut分詞結(jié)果與jieba.cut不一致
- 2021-12-16 聊聊Navicat統(tǒng)計的行數(shù)竟然和表實際行數(shù)不一致的問題_數(shù)據(jù)庫其它
- 2022-03-15 更新Android Studio 4.0 啟動模擬器提示 unable to locate adb
- 2022-11-10 Redis源碼設(shè)計剖析之事件處理示例詳解_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支