C++实现多线程socket通信,可多连接
来源:互联网 发布:模拟羊水声音软件 编辑:程序博客网 时间:2024/05/17 03:25
服务端
#include "InitSock.h"#include <stdio.h>#include <iostream>#include <string.h>#include<WS2tcpip.h>#include<cstring>using namespace std;CInitSock initSock; // 初始化Winsock库struct KK{ SOCKET sClient; char ip[20]; KK() { sClient = 0; }};KK con[100];int num = 0;// 创建套节字SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);DWORD _stdcall go(LPVOID IpParamenter){ KK *temp = (KK *)IpParamenter; char buff[256]; while (true) { int nRecv = ::recv(temp->sClient, buff, 256, 0); if (nRecv > 0) { buff[nRecv] = '\0'; printf(" 接收 %s:%s\n", temp->ip, buff); } } return 0;}DWORD _stdcall find(LPVOID IpParamenter){ while (true) { con[num].sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); if (con[num].sClient == INVALID_SOCKET) { printf("Failed accept()"); } char sendBuf[20] = { '\0' }; inet_ntop(AF_INET, (void*)&remoteAddr.sin_addr, sendBuf, 16); printf("接受到一个连接:%s \r\n", sendBuf); strcpy(con[num].ip, sendBuf); CreateThread(NULL, 0, go, &con[num], 0, NULL); num++; } return 0;}int main(){ if (sListen == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } // 填充sockaddr_in结构 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = INADDR_ANY; // 绑定这个套节字到一个本地地址 if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("Failed bind() \n"); return 0; } // 进入监听模式 if (::listen(sListen, 2) == SOCKET_ERROR) { printf("Failed listen() \n"); return 0; } // 循环接受客户的连接请求 SOCKET sClient = 0; char szText[] = " TCP Server Demo! \r\n"; CreateThread(NULL, 0, find, NULL, 0, NULL); while (TRUE) { // 向客户端发送数据 cin >> szText; for (int i = 0; i < num; i++) { ::send(con[i].sClient, szText, strlen(szText), 0); } // 从客户端接收数据 } // 关闭同客户端的连接 ::closesocket(sClient); // 关闭监听套节字 ::closesocket(sListen); return 0;}
客户端
#include "InitSock.h"#include <stdio.h>#include <iostream>#include<WS2tcpip.h>using namespace std;CInitSock initSock; // 初始化Winsock库char buff[256];SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);DWORD _stdcall go(LPVOID IpParamenter){ while (TRUE) { int nRecv = ::recv(s, buff,900, 0); if (nRecv > 0) { buff[nRecv] = '\0'; printf("接收到数据:%s\n", buff); } } return 0;}int main(){ CreateThread(NULL, 0, go, NULL, 0, NULL); // 创建套节字 //SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { printf(" Failed socket() \n"); return 0; } // 也可以在这里调用bind函数绑定一个本地地址 // 否则系统将会自动安排 // 填写远程地址信息 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(2001); // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址 // 如果你的计算机没有联网,直接使用127.0.0.1即可 inet_pton(AF_INET, "192.168.1.1", (void*)&servAddr.sin_addr.S_un.S_addr); if (::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { printf(" Failed connect() \n"); return 0; } cout << "connect succeed!\n"; char szText[256]; /*while (TRUE) { //从服务器端接收数据 /*int nRecv = ::recv(s, buff, 256, 0); if (nRecv > 0) { buff[nRecv] = '\0'; printf("接收到数据:%s\n", buff); }*/ // 向服务器端发送数据 /* Sleep(1000); strcpy_s(szText,"1023\n"); szText[255] = '\0'; ::send(s, szText, strlen(szText), 0); }*/ // 关闭套节字 ::closesocket(s); return 0;}
阅读全文
1 0
- C++实现多线程socket通信,可多连接
- java Socket 使用多线程实现一对多的通信
- JAVA Socket 多线程实现多客户端的通信
- C#-Socket通信如何实现?
- C#Socket多线程通信(聊天室)
- 自己实现的socket多线程通信
- java nio socket实现多线程多用户通信
- MFC下多线程实现socket通信
- java实现多线程的socket通信技术
- Socket通信(二)-- 多线程服务器实现
- Socket 通信实现 Flash 与Java连接
- socket实现c/s连接
- [原]VC SOCKET实现多线程并发连接
- Linux socket之二:面向连接的socket通信实现
- Linux socket之二:面向连接的socket通信实现
- Linux C语言实现的Socket通信
- windows下用c实现Socket通信
- C语言--利用UDP实现socket通信
- 文档啊,最重要的还是层次感
- 基于Python的期货公司后台业务思考与实践
- 邻接表实现 单源最短路径SPFA算法
- 循环嵌套
- MongoDB学习笔记之文档的CRUD
- C++实现多线程socket通信,可多连接
- 58-总结-【cartographer源码分析】系列的第六部分【 mapping 】
- easyUI tree+layout SpringMVC 点击west里的菜单,在center里展示页面
- 使用php的GD库拼接图片
- 微服务架构(三):微服务重构应用及IBM解决方案
- 强学习器------随机森林
- Linux学习-grep命令整理
- VUE快速入门心得——深入了解render函数
- Dubbo是什么?能做什么?