Windows下基于socket多线程并发通信的实现

来源:互联网 发布:免费下载农村淘宝app 编辑:程序博客网 时间:2024/06/05 21:04

    本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的应用实例并附有程序。

关键词:Windows;套接字;多线程;并发服务器;

    Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket 屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能,Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本机制以及采用多线程技术实现并发通信的基本原理,并给出实例。

全部代码详见:http://download.csdn.net/detail/xy010902100449/8570623

//-----------------------------------------------------------------------------------// 版权归scut4009所有//-----------------------------------------------------------------------------------// 文件名:SocketSever.cpp// 编写人:ZP1015// 编写时间:2015/04/7// 编译工具: Visual Studio 2008// 程序说明: socket多线程通信,服务器端,基于TCP//------------------------------------------------------------------------------------#include "stdafx.h"#include "Socket.h"#include<windows.h>HANDLE hMutex;//------------------------------------------------------------------------------------//函数名称:      Send(SOCKET sockClient)/*函数功能:      发送数据/*入口参数:      SOCKET sockClient //出口参数:     //全局变量引用:  //调用模块:      无 //------------------------------------------------------------------------------------*/void Send(SOCKET sockClient){char sendBuf[MaxSize];int byte = 0;while(1){WaitForSingleObject(hMutex, INFINITE);gets(sendBuf);byte= send(sockClient,sendBuf,strlen(sendBuf)+1,0);;//服务器从客户端接受数据if (byte<=0){break;}Sleep(1000);ReleaseMutex(hMutex);}closesocket(sockClient);//关闭socket,一次通信完毕}//------------------------------------------------------------------------------------//函数名称:     Rec()/*函数功能:     接收函数/*入口参数:     SOCKET sockClient //出口参数:     //全局变量引用:  //调用模块:      无 //------------------------------------------------------------------------------------*/void Rec(SOCKET sockClient){char revBuf[MaxSize];int byte = 0;while(1){WaitForSingleObject(hMutex, INFINITE);byte= recv(sockClient,revBuf,strlen(revBuf)+1,0);//服务器从客户端接受数据if (byte<=0){break;}printf("%s\n",revBuf);Sleep(1000);ReleaseMutex(hMutex);}closesocket(sockClient);//关闭socket,一次通信完毕}//********************************************************************************************************///** 函数名 ** main()//**  输入  ** 无//**  输出  ** 无//**函数描述** 主函数//********************************************************************************************************/int main(){SOCKADDR_IN addrServer;int sockServer;  if (SOCKET_ERROR ==SocketInit()) { return -1; }addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol将主机字节序long型转换为网络字节序addrServer.sin_family=AF_INET;addrServer.sin_port=htons(6666);//htos用来将端口转换成字符,1024以上的数字即可sockServer=socket(AF_INET,SOCK_STREAM,0);//面向连接的可靠性服务SOCK_STRAMbind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));//将socket绑定到相应地址和端口上listen(sockServer,5);//等待队列中的最大长度为5printf("Welcome,the Host %s is running!Now Wating for someone comes in!\n",inet_ntoa(addrServer.sin_addr));int len=sizeof(SOCKADDR);SOCKADDR_IN addrClient;while(1){SOCKET sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);//阻塞调用进程直至新的连接出现if(sockClient == INVALID_SOCKET){printf("Accept Failed!\n");continue; //继续监听}HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Send,(LPVOID)sockClient,0,0);//发送if(hThread1!=NULL){CloseHandle(hThread1);}HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rec,(LPVOID)sockClient,0,0);//接收if(hThread2!=NULL){CloseHandle(hThread2);}Sleep(1000);//一定要}getchar();return 0;}
//-----------------------------------------------------------------------------------// 版权归scut4009所有//-----------------------------------------------------------------------------------// 文件名:SocketClient.cpp// 编写人:ZP1015// 编写时间:2015/04/7// 编译工具: Visual Studio 2008// 程序说明: socket多线程通信//------------------------------------------------------------------------------------#include "stdafx.h"#include "Socket.h"#pragma comment(lib,"WS2_32.LIB")const char *SeverIp = "192.168.1.100";HANDLE hMutex;//------------------------------------------------------------------------------------//函数名称:      Send(SOCKET sockClient)/*函数功能:      发送数据/*入口参数:      SOCKET sockClient //出口参数:     //全局变量引用:  //调用模块:      无 //------------------------------------------------------------------------------------*/void Send(SOCKET sockClient){char sendBuf[MaxSize];int byte = 0;while(1){WaitForSingleObject(hMutex, INFINITE);gets(sendBuf);byte= send(sockClient,sendBuf,strlen(sendBuf)+1,0);;//服务器从客户端接受数据if (byte<=0){break;}Sleep(1000);ReleaseMutex(hMutex);}closesocket(sockClient);//关闭socket,一次通信完毕}//------------------------------------------------------------------------------------//函数名称:     Rec()/*函数功能:     接收函数/*入口参数:     SOCKET sockClient //出口参数:     //全局变量引用:  //调用模块:      无 //------------------------------------------------------------------------------------*/void Rec(SOCKET sockClient){char revBuf[MaxSize];int byte = 0;while(1){WaitForSingleObject(hMutex, INFINITE);byte= recv(sockClient,revBuf,strlen(revBuf)+1,0);//服务器从客户端接受数据if (byte<=0){break;}printf("%s\n",revBuf);Sleep(1000);ReleaseMutex(hMutex);}closesocket(sockClient);//关闭socket,一次通信完毕}int main(){if (SOCKET_ERROR ==SocketInit()){return -1;}while(1){SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(SeverIp);//设定需要连接的服务器的ip地址addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6666);//设定需要连接的服务器的端口地址connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//与服务器进行连接HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rec,(LPVOID)sockClient,0,0);if(hThread1!=NULL){CloseHandle(hThread1);}HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Send,(LPVOID)sockClient,0,0);if(hThread2!=NULL){CloseHandle(hThread2);}Sleep(1000);}getchar();    WSACleanup();return -1;}



3 2
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安卓系统手机亮度调到最低怎么办 阿里妈妈买家号虚假交易违规怎么办 淘宝商让我修改追评叫我怎么办 红冲金额大于了当月的销售额怎么办 淘宝买家号虚假交易评价删除怎么办 淘宝卖的宝贝电话写错了怎么办 邮政快递都揽件了一直不运输怎么办 应用宝里面的安装包安装不了怎么办 苹果平板电脑充电接口坏了怎么办 读书郎平板电脑开不了机怎么办 平板电脑死机开不了机了怎么办 欧灵平板电脑忘记图密解锁怎么办 淘宝没货发给人被投诉了怎么办 淘宝店铺既不能开又不能注销怎么办 妻子被骗五万疑似被洗脑我该怎么办 奖虫账号和密码不匹配怎么办 开淘宝店余额宝里的钱怎么办 京东找不到所有宝贝的链接了怎么办 淘宝店链接改了标题没流量怎么办 淘宝手淘搜索自然流量少怎么办 4个月宝贝不食欲下降怎么办 淘宝商家预售时间到了不发货怎么办 淘宝修改类目被处置管控了怎么办 淘宝换手机号是已经注册了的怎么办 闲鱼违规把我淘宝店铺冻结了怎么办 开网店店主想买自己的东西怎么办 以前用微博登录头条的账号怎么办 公众号注册提示邮箱已被占用怎么办 学信网注册时出现邮箱被占用怎么办 手机淘宝店铺接不到买家消息怎么办 买了东西淘宝店铺没了怎么办 淘宝店铺直播间虚假交易违规怎么办 手机淘宝退款物流单号填错了怎么办 淘宝评价删除了卖家没有返现怎么办 想摆摊卖麻辣烫不知怎么摆怎么办 在淘宝卖东西买家退款不退货怎么办 在闲鱼网上买东西被骗了怎么办 开通花呗的手机号不用了怎么办 饿了么开业第一天没单量怎么办 淘宝新开店铺没有人来呀怎么办 刚开的淘宝店铺没有人买东西怎么办