65,211
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <winsock2.h>
#include <mswsock.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
typedef struct _PerData
{
WSAOVERLAPPED ol;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
SOCKET ClientSocket;
WSABUF Buf;
} PerData;
HANDLE ComPort;
DWROD _stdcall ServerWorkThread(LPVOID )
{
return 0;
}
void main()
{
WSADATA Wsadata;
SYSTEM_INFO Info;
PerData PD;
SOCKET ListenSocket;
HANDLE ComPort;
LPFN_ACCEPTEX lpfnAcceptEx=NULL;
LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs=NULL;
GUID GuidGetAcceptExSockaddrs=WSAID_GETACCEPTEXSOCKADDRS;
GUID GuidAcceptEx=WSAID_ACCEPTEX;
char Buf[1024];
DWORD NumBytes;
DWORD flag;
int rc,i;
if(WSAStartup(MAKEWORD(2,2),&Wsadata))
{ cout<<"注册失败!"<<endl;
getchar();
}
ComPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,NULL);
if(ComPort==INVALID_HANDLE_VALUE)
{ cout<<"创建端口失败"<<endl;
getchar();
}
GetSystemInfo(&Info);
for(i=0;i<Info.dwNumberOfProcessors*2;i++)
{
HANDLE Handle;
Handle=CreateThread(NULL,0,ServerWorkThread,ComPort,0,NULL);
CloseHandle(Handle);
}
ListenSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(ListenSocket==INVALID_SOCKET)
{ cout<<"套接字创建失败!错误:"<<WSAGetLastError()<<endl;
exit(0);
}
PD.Buf.buf=Buf;
PD.Buf.len=10;
PD.ClientSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(PD.ClientSocket==INVALID_SOCKET)
{ cout<<"套接字创建失败!错误:"<<WSAGetLastError()<<endl;
exit(0);
}
PD.ClientAddr.sin_family =AF_INET;
PD.ClientAddr.sin_port =htons(5050);
PD.ClientAddr.sin_addr.s_addr=(htonl)(INADDR_ANY);
if(bind(ListenSocket,(SOCKADDR*)&PD.ClientAddr,sizeof(PD.ClientAddr))==SOCKET_ERROR)
{ cout<<"套接字绑定失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
rc=WSAIoctl(ListenSocket,SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx,
sizeof(GuidAcceptEx),
&lpfnAcceptEx,
sizeof(lpfnAcceptEx),
&NumBytes,
NULL,
NULL);
if(rc==SOCKET_ERROR)
{ cout<<"加载lpfnAcceptEx函数失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
if(listen(ListenSocket,5)==SOCKET_ERROR)
{ cout<<"监听套接字失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
cout<<"开始接受连接!!!"<<endl;
while(TRUE)
{
memset(&PD.ol,0,sizeof(WSAOVERLAPPED));
if(!lpfnAcceptEx(ListenSocket,
PD.ClientSocket,
PD.Buf.buf,10,
sizeof(SOCKADDR_IN)+16,
sizeof(SOCKADDR_IN)+16,
&NumBytes,
(WSAOVERLAPPED*)&PD))
{
printf("接受连接失败!错误:%d\n",WSAGetLastError());
getchar();
continue;
}
printf("投递成功!\n");
}
//用重叠模型写了一个接收并显示的,自己改成完成端口,VC9下测试.
//很多收尾工作没有做.
#include <stdio.h>
#include <winsock2.h>
#include <mswsock.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
typedef struct _PerData
{
WSAOVERLAPPED ol;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
SOCKET ClientSocket;
WSABUF Buf;
} PerData;
HANDLE ComPort;
DWORD _stdcall ServerWorkThread(LPVOID )
{
return 0;
}
void main()
{
WSADATA Wsadata;
SYSTEM_INFO Info;
PerData PD;
SOCKET ListenSocket;
HANDLE ComPort;
LPFN_ACCEPTEX lpfnAcceptEx=NULL;
LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs=NULL;
GUID GuidGetAcceptExSockaddrs=WSAID_GETACCEPTEXSOCKADDRS;
GUID GuidAcceptEx=WSAID_ACCEPTEX;
char Buf[1024];
DWORD NumBytes;
DWORD flag;
int rc,i;
if(WSAStartup(MAKEWORD(2,2),&Wsadata))
{ cout<<"注册失败!"<<endl;
getchar();
}
ComPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,NULL);
if(ComPort==INVALID_HANDLE_VALUE)
{ cout<<"创建端口失败"<<endl;
getchar();
}
GetSystemInfo(&Info);
for(i=0;i<Info.dwNumberOfProcessors*2;i++)
{
HANDLE Handle;
Handle=CreateThread(NULL,0,ServerWorkThread,ComPort,0,NULL);
CloseHandle(Handle);
}
ListenSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(ListenSocket==INVALID_SOCKET)
{ cout<<"套接字创建失败!错误:"<<WSAGetLastError()<<endl;
exit(0);
}
PD.Buf.buf=Buf;
PD.Buf.len=10;
PD.ClientSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(PD.ClientSocket==INVALID_SOCKET)
{ cout<<"套接字创建失败!错误:"<<WSAGetLastError()<<endl;
exit(0);
}
PD.ClientAddr.sin_family =AF_INET;
PD.ClientAddr.sin_port =htons(5050);
PD.ClientAddr.sin_addr.s_addr=(htonl)(INADDR_ANY);
if(bind(ListenSocket,(SOCKADDR*)&PD.ClientAddr,sizeof(PD.ClientAddr))==SOCKET_ERROR)
{ cout<<"套接字绑定失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
rc=WSAIoctl(ListenSocket,SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx,
sizeof(GuidAcceptEx),
&lpfnAcceptEx,
sizeof(lpfnAcceptEx),
&NumBytes,
NULL,
NULL);
if(rc==SOCKET_ERROR)
{ cout<<"加载lpfnAcceptEx函数失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
if(listen(ListenSocket,5)==SOCKET_ERROR)
{ cout<<"监听套接字失败!错误:"<<WSAGetLastError()<<endl;
getchar();
return ;
}
cout<<"开始接受连接!!!"<<endl;
memset(&PD.ol,0,sizeof(WSAOVERLAPPED));
PD.ol.hEvent = WSACreateEvent();
DWORD tran;
lpfnAcceptEx(ListenSocket,
PD.ClientSocket,
PD.Buf.buf,10,
sizeof(SOCKADDR_IN)+16,
sizeof(SOCKADDR_IN)+16,
&NumBytes,
(WSAOVERLAPPED*)&PD.ol);
while (1)
{
WSAWaitForMultipleEvents(1, &PD.ol.hEvent, 1, WSA_INFINITE, 0);
WSAResetEvent(PD.ol.hEvent);
WSAGetOverlappedResult(PD.ClientSocket, &PD.ol, &tran, 1, &flag);
if (tran)
{
PD.Buf.buf[tran] = 0;
printf("%s", PD.Buf.buf);
}
else
{
closesocket(PD.ClientSocket);
break;
}
WSARecv(PD.ClientSocket, &PD.Buf, 1, &tran, &flag, &PD.ol, NULL);
}
}
开始接受连接!!!
abcdefghijklmn请按任意键继续. . .
Linking...
Test.obj : error LNK2001: unresolved external symbol __imp__listen@8
Test.obj : error LNK2001: unresolved external symbol __imp__WSAIoctl@36
Test.obj : error LNK2001: unresolved external symbol __imp__bind@12
Test.obj : error LNK2001: unresolved external symbol __imp__htonl@4
Test.obj : error LNK2001: unresolved external symbol __imp__htons@4
Test.obj : error LNK2001: unresolved external symbol __imp__WSAGetLastError@0
Test.obj : error LNK2001: unresolved external symbol __imp__WSASocketA@24
Test.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
Debug/AcceptExTest.exe : fatal error LNK1120: 8 unresolved externals
Error executing link.exe.