#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define PORT 6000
//#define IP_ADDRESS "10.11.163.113" //表示服务器端的地址
#define IP_ADDRESS "127.0.0.1" //直接使用本机地址
#define MSGSIZE 1024
//与重叠IO结构相关的一些信息,把它们封装在一个结构体中方便管理
class PerSocketData
{
public:
WSAOVERLAPPED overlap;//每一个socket连接需要关联一个WSAOVERLAPPED对象
WSABUF buffer;//与WSAOVERLAPPED对象绑定的缓冲区
char szMessage[MSGSIZE];//初始化buffer的缓冲区
DWORD NumberOfBytesRecvd;//指定接收到的字符的数目
DWORD flags;
};
//使用这个工作线程来通过重叠IO的方式与客户端通信
DWORD WINAPI workThread(LPVOID lpParam)
{
HANDLE completionPort=(HANDLE)lpParam;
DWORD dwBytesTransfered;
SOCKET clientSocket;
PerSocketData * lpIOdata=NULL;
while(true)
{
GetQueuedCompletionStatus(
completionPort,
&dwBytesTransfered,
(LPDWORD)&clientSocket,
(LPOVERLAPPED*)&lpIOdata,
INFINITE);
if (dwBytesTransfered==0xFFFFFFFF)
{
return 0;
}
if (dwBytesTransfered==0)
{
cout<<"客户端退出"<<endl;
closesocket(clientSocket);
HeapFree(GetProcessHeap(),0,lpIOdata);
}
else
{
cout<<lpIOdata->szMessage<<endl;
send(clientSocket,lpIOdata->szMessage,dwBytesTransfered+1,0);//多发送一个字符,将字符串结束符也发送过去
memset(lpIOdata,0,sizeof(PerSocketData));
lpIOdata->buffer.len=MSGSIZE;
lpIOdata->buffer.buf=lpIOdata->szMessage;
WSARecv(clientSocket,
&lpIOdata->buffer,
1,
&lpIOdata->NumberOfBytesRecvd,
&lpIOdata->flags,
&lpIOdata->overlap,
NULL);
}
}
return 0;
}
void main()
{
WSADATA wsaData;
int err;
//1.加载套接字库
err=WSAStartup(MAKEWORD(1,1),&wsaData);
if (err!=0)
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
return ;
}
//下面执行一些使用完成端口需要进行的步骤
//创建一个完成端口
HANDLE completionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
PerSocketData * sockData;
SYSTEM_INFO systeminfo;
GetSystemInfo(&systeminfo);
DWORD dwThreadId;
for (int i=0;i<systeminfo.dwNumberOfProcessors;i++)
{
CreateThread(NULL,0,workThread,completionPort,0,&dwThreadId);
}
//2.创建socket
//套接字描述符,SOCKET实际上是unsigned int
SOCKET serverSocket;
serverSocket=socket(AF_INET,SOCK_STREAM,0);
if (serverSocket==INVALID_SOCKET)
{
cout<<"Create Socket Failed::"<<GetLastError()<<endl;
return ;
}
//服务器端的地址和端口号
struct sockaddr_in serverAddr,clientAdd;
serverAddr.sin_addr.s_addr=inet_addr(IP_ADDRESS);
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(PORT);
//3.绑定Socket,将Socket与某个协议的某个地址绑定
err=bind(serverSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if (err!=0)
{
cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
return ;
}
//4.监听,将套接字由默认的主动套接字转换成被动套接字
err=listen(serverSocket,10);
if (err!=0)
{
cout<<"listen Socket Failed::"<<GetLastError()<<endl;
return ;
}
cout<<"服务器端已启动......"<<endl;
int addrLen=sizeof(clientAdd);
SOCKET sockConn;
while(true)
{
//5.接收请求,当收到请求后,会将客户端的信息存入clientAdd这个结构体中,并返回描述这个TCP连接的Socket
sockConn=accept(serverSocket,(struct sockaddr*)&clientAdd,&addrLen);
if (sockConn==INVALID_SOCKET)
{
cout<<"Accpet Failed::"<<GetLastError()<<endl;
return ;
}
cout<<"客户端连接:"<<inet_ntoa(clientAdd.sin_addr)<<":"<<clientAdd.sin_port<<endl;
//将之前的第6步替换成了下面的操作
CreateIoCompletionPort((HANDLE)sockConn,completionPort,(DWORD)sockConn,0);
sockData=(PerSocketData*)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(PerSocketData));
sockData->buffer.len=MSGSIZE;
sockData->buffer.buf=sockData->szMessage;
WSARecv(
sockConn,
&sockData->buffer,
1,
&sockData->NumberOfBytesRecvd,
&sockData->flags,
&sockData->overlap,
NULL);
}
PostQueuedCompletionStatus(completionPort,0xFFFFFFFF,0,NULL);
CloseHandle(completionPort);
closesocket(serverSocket);
//7.清理Windows Socket库
WSACleanup();
}
没有合适的资源?快使用搜索试试~ 我知道了~
socket工程文件完成端口版本
共28个文件
pdb:4个
suo:2个
htm:2个
5星 · 超过95%的资源 需积分: 10 62 下载量 14 浏览量
2015-09-03
16:02:24
上传
评论 1
收藏 6.67MB RAR 举报
温馨提示
socket通信的客户端和服务器端的工程程序,基于完成端口技术,实现了多个客户端向服务器端持续发送数据
资源推荐
资源详情
资源评论
收起资源包目录
socket工程文件完成端口版本.rar (28个子文件)
TCPServer
Release
TCPServer.exe 11KB
TCPServer.pdb 411KB
TCPServer.sln 893B
TCPServer.suo 25KB
TCPServer
Release
BuildLog.htm 6KB
server.obj 546KB
TCPServer.exe.intermediate.manifest 616B
vc90.pdb 236KB
vc90.idb 187KB
mt.dep 65B
TCPServer.vcproj.allan-PC.allan.user 1KB
TCPServer.vcproj 4KB
server.cpp 4KB
TCPServer.ncb 14.96MB
TCPClient
TCPClient.suo 15KB
Release
TCPClient.exe 10KB
TCPClient.pdb 403KB
TCPClient.ncb 15MB
TCPClient.sln 893B
TCPClient
Release
BuildLog.htm 6KB
TCPClient.exe.intermediate.manifest 616B
vc90.pdb 228KB
vc90.idb 195KB
mt.dep 65B
client.obj 543KB
TCPClient.vcproj.allan-PC.allan.user 1KB
client.cpp 1KB
TCPClient.vcproj 4KB
共 28 条
- 1
资源评论
- 香烟恋上火柴2018-03-07再次下载学习
- 爆椒火龙果2017-07-10还可以,学习学习
- laoyuttl2018-03-18正在学习完成端口,感谢分享。
- bluedump2017-09-03谢谢楼主的分享 好资料
vincent-xia
- 粉丝: 308
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功