#include <stdlib.h>
#include <iostream.h>
#include <winsock2.h>
#pragma comment(lib, "wsock32.lib")
#define NUM_THREAD 2 //定义线程个数
#define BUFFER_SIZE 256 //定义缓冲区大小
HANDLE session_thread_handle[NUM_THREAD]; //定义线程句柄
SOCKET clientSocket; //客户套接字
char recvBuffer[BUFFER_SIZE]; //接收缓冲区
char sendBuffer[BUFFER_SIZE]; //发送缓冲区
void AdminThread(); //管理线程函数
void RecvThread(); //接收线程
void SendThread(); //发送线程
void KillAllThread(); //线程回收
void main()
{
SOCKET sock; //socket
//char szMsg[] = "this is a TCP test package";//被发送的字段
//1.启动SOCKET库,版本为2.0
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
cout<<"Socket2.0初始化失败,Exit!";
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup( );
return;
}
//2.创建socket,
sock = socket(
AF_INET, //internetwork: UDP, TCP, etc
SOCK_STREAM, //SOCK_STREAM说明是TCP socket
0 //protocol
);
if (sock == INVALID_SOCKET )
{
cout<<"Socket 创建失败,Exit!";
return;
}
//3.bind套接字,相当于给本地套接字赋值
sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr = ADDR_ANY;
myaddr.sin_port=htons(7861);
bind(sock,(sockaddr*)&myaddr,sizeof(myaddr));
//4.设置发往的地址
sockaddr_in addrto; //发往的地址
memset(&addrto,0,sizeof(addrto));
//5.listen socket
if (listen(sock,5) == SOCKET_ERROR )
{
closesocket(sock);
WSACleanup();
abort();
}
else
{
cout<<"listen succeed!"<<endl;
}
//6. accept 对方连接
int nlen = sizeof(addrto);
clientSocket = accept(sock,(sockaddr*)&addrto,&nlen);
if (clientSocket < 0)
{
cout<<"client socket error, exit!"<<endl;
abort();
}
else
{
cout<<"accepted client socket!"<<endl;
}
//调用管理线程函数创建线程、线程同步、回收线程
AdminThread();
if (!closesocket(sock))
{
WSAGetLastError();
return;
}
if (!closesocket(clientSocket))
{
WSAGetLastError();
return;
}
if (!WSACleanup())
{
WSAGetLastError();
return;
}
}
void AdminThread()//管理线程函数
{
for(int i=0; i<NUM_THREAD; i++)
{
DWORD session_thread_id = i;
switch(i)
{
case 0://利用CreateThread()函数创建接收线程
session_thread_handle[i] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE)RecvThread,
0,
0,
&session_thread_id);
break;
case 1://利用CreateThread()函数创建发送线程
session_thread_handle[i] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE)SendThread,
0,
0,
&session_thread_id);
break;
default:
break;
}
}
//利用WaitForMultipleObjects()函数实现线程同步
WaitForMultipleObjects(NUM_THREAD, session_thread_handle, TRUE, 0xffffffff);
//线程回收
KillAllThread();
}
void RecvThread()//接收线程
{
int iResult = 0;
while(true)
{
iResult = recv(clientSocket,recvBuffer,sizeof(recvBuffer),0);
if (iResult < 0)
{
cout<<"客户方Socket关闭,退出!"<<endl;
break;
}
cout<<"客户端:"<<recvBuffer<<endl;
memset(recvBuffer,0,sizeof(recvBuffer));
}
}
void SendThread()//发送线程
{
while(true)
{
cin>>sendBuffer;
// strncat(sendBuffer, "\x0D\x0A", sizeof(sendBuffer));
if( send(clientSocket, sendBuffer, strlen(sendBuffer), 0) == SOCKET_ERROR )
cout<<"error, error id = "<<WSAGetLastError()<<endl;
}
}
void KillAllThread()//线程回收
{
for(int i=0; i<NUM_THREAD; i++)
{
if(session_thread_handle[i])
{
TerminateThread(session_thread_handle[i], 0);
CloseHandle(session_thread_handle[i]);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
TCP双向通信(windows系统)
共26个文件
pdb:4个
dsp:2个
exe:2个
2星 需积分: 10 57 下载量 4 浏览量
2008-12-17
21:40:50
上传
评论 1
收藏 2.41MB RAR 举报
温馨提示
在Windows任意操作系统下,用visual C++6.0编写程序,并在C++环境下实现程序的运行。 用socket编程技术,结合TCP通信模型编写通信程序
资源推荐
资源详情
资源评论
收起资源包目录
TCPtongxin.rar (26个子文件)
TCPThreadClient
TCPThreadClient.dsp 3KB
TCPThreadClient.opt 48KB
Debug
vc60.pdb 84KB
TCPThreadClient.pch 3.52MB
TCPThreadClient.ilk 252KB
vc60.idb 145KB
TCPThreadClient.exe 208KB
TCPThreadClient.obj 21KB
TCPThreadClient.pdb 417KB
TCPThreadClient.plg 783B
TCPThreadClient.cpp 3KB
TCPThreadClient.dsw 538B
TCPThreadClient.ncb 33KB
TCPThreadServer
TCPThreadServer.plg 783B
TCPThreadServer.ncb 33KB
Debug
vc60.pdb 84KB
vc60.idb 145KB
TCPThreadServer.obj 22KB
TCPThreadServer.pch 3.53MB
TCPThreadServer.exe 208KB
TCPThreadServer.pdb 521KB
TCPThreadServer.ilk 255KB
TCPThreadServer.dsw 538B
TCPThreadServer.cpp 4KB
TCPThreadServer.opt 48KB
TCPThreadServer.dsp 3KB
共 26 条
- 1
资源评论
- qwd1081142016-04-29有用,学习中,感谢
- 雷伊_20132013-05-30有用,学习中,感谢
qxljay2008
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最速下降法解线性方程组 及图形化表示 北太天元 or matlab
- openEuler-22.03-LTS-SP3-aarch64-dvd.zip.001
- 图像分割-基于Pytorch在VOC+Cityscapes上训练DeepLabv3+图像分割算法-附项目源码+详细流程教程
- 基于Java小区物业管理系统(源码+使用文档)
- 浙江省杭州市百度地图AOI
- 基于Java画图形学(源码+使用文档)
- JavaProject1.zip
- Python爬虫课程设计-爬取图书信息进行可视化分析(说明文档 + 源码)
- 基于Objective-C的地方性首饰专卖设计源码
- 数据库课程设计-jsp宾馆信息管理系统(开发文档 + 源码 + 数据库文件)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功