求一个最简单的程序,客户端将字符串传给服务端,服务端将所有的字母变为大写,在传回客户端。没有转换功能的程序也可以,我自己再加工!
解决方案 »
- vs2008 sp1补丁下的弹出式对话框风格问题,急!在线等!!!
- 传输层上数据包的捕获
- 《windows程序设计》 中ddl原程序执行后出现“调试对话”对话框,不是做什么用的??
- 在6.0下怎么生成realse文件?
- 我想在工具栏里显示图片和文字`可是文字显示得太低了``请教``
- 如何设置是Line-in还是Mic-in
- 怎么检测WINDOWS中被装了键盘钩子?
- :Access violation!
- 菜鸟问题:如何动态分配大于64K的内存,谢谢!急啊!!!!!!!!!!!!!!!!
- 如何共享NT的文件夹并设置访问权限
- 虚心请教大家一个关于 recv 接收数据不完全的问题
- OCX 怎么抛出事件
#include <winsock2.h>
#include <mswsock.h>
#include <windows.h>#include <iostream>
using namespace std;int g_ThreadCount;
HANDLE g_hIOCP = INVALID_HANDLE_VALUE;
SOCKET g_ServerSocket = INVALID_SOCKET;#define SERVER_PORT 6000// Maximum Buffer Size
#define MAX_BUFF_SIZE 1024*512enum IO_OPERATION{IO_READ,IO_WRITE};struct IO_DATA{
WSAOVERLAPPED Overlapped;
char Buffer[MAX_BUFF_SIZE];
WSABUF wsabuf;
int nTotalBytes;
int nSentBytes;
IO_OPERATION opCode;
SOCKET activeSocket;
};DWORD WINAPI WorkerThread (LPVOID WorkThreadContext) {
LPWSAOVERLAPPED lpOverlapped = NULL;
IO_DATA *lpIOContext = NULL;
WSABUF buffSend;
DWORD dwRecvNumBytes = 0;
DWORD dwSendNumBytes = 0;
DWORD dwFlags = 0;
DWORD dwIoSize = 0;
BOOL bSuccess = FALSE;
int nRet = 0; while( 1 ) {
void * lpCompletionKey = NULL;
bSuccess = GetQueuedCompletionStatus(g_hIOCP, &dwIoSize,
(LPDWORD)&lpCompletionKey,
(LPOVERLAPPED *)&lpOverlapped,
INFINITE);
if( !bSuccess )
{
cout << "GetQueuedCompletionStatus() failed:"<<GetLastError()<<endl;
break;
} lpIOContext = (IO_DATA *)lpOverlapped; if(dwIoSize == 0) //socket closed?
{
cout << "Client disconnect" << endl;
closesocket(lpIOContext->activeSocket);
delete lpIOContext;
continue;
} if(lpIOContext->opCode == IO_READ) // a read operation complete
{
lpIOContext->nTotalBytes = lpIOContext->wsabuf.len;
lpIOContext->nSentBytes = 0;
lpIOContext->opCode = IO_WRITE;
dwFlags = 0; DWORD dwRecvNumBytes;
WSAGetOverlappedResult(lpIOContext->activeSocket,&(lpIOContext->Overlapped),&dwRecvNumBytes,TRUE,NULL);
cout <<"Echo Server:: reading data len = " << dwRecvNumBytes <<endl; lpIOContext->wsabuf.len = dwRecvNumBytes;
lpIOContext->nTotalBytes = dwRecvNumBytes;
lpIOContext->nSentBytes = 0; nRet = WSASend(
lpIOContext->activeSocket,
&lpIOContext->wsabuf, 1, &dwSendNumBytes,
dwFlags,
&(lpIOContext->Overlapped), NULL);
if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
cout << "WASSend Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(lpIOContext->activeSocket);
delete lpIOContext;
continue;
}
}
else if(lpIOContext->opCode == IO_WRITE) //a write operation complete
{
WSAGetOverlappedResult(lpIOContext->activeSocket,&(lpIOContext->Overlapped),&dwIoSize,TRUE,NULL);
cout <<"Echo Server:: write data len = " << dwIoSize <<endl; lpIOContext->nSentBytes += dwIoSize;
dwFlags = 0;
if( lpIOContext->nSentBytes < lpIOContext->nTotalBytes ) {
lpIOContext->opCode = IO_WRITE;
// A Write operation has not completed yet, so post another
// Write operation to post remaining data.
buffSend.buf = lpIOContext->Buffer + lpIOContext->nSentBytes;
buffSend.len = lpIOContext->nTotalBytes - lpIOContext->nSentBytes;
nRet = WSASend (
lpIOContext->activeSocket,
&buffSend, 1, &dwSendNumBytes,
dwFlags,
&(lpIOContext->Overlapped), NULL); if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
cout << "WASSend Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(lpIOContext->activeSocket);
delete lpIOContext;
continue;
}
} else {
// Write operation completed, so post Read operation.
lpIOContext->opCode = IO_READ;
dwRecvNumBytes = 0;
dwFlags = 0;
lpIOContext->wsabuf.buf = lpIOContext->Buffer,
ZeroMemory(lpIOContext->wsabuf.buf,MAX_BUFF_SIZE);
lpIOContext->Overlapped.Internal = 0;
lpIOContext->Overlapped.InternalHigh = 0;
lpIOContext->Overlapped.Offset = 0;
lpIOContext->Overlapped.OffsetHigh = 0;
lpIOContext->Overlapped.hEvent = NULL;
lpIOContext->wsabuf.len = MAX_BUFF_SIZE;
nRet = WSARecv(
lpIOContext->activeSocket,
&lpIOContext->wsabuf, 1, &dwRecvNumBytes,
&dwFlags,
&lpIOContext->Overlapped, NULL);
if( nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()) ) {
cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(lpIOContext->activeSocket);
delete lpIOContext;
continue;
}
}
}
}
return 0;
}void main (int argc, char * argv[])
{
{ // Init winsock2
WSADATA wsaData;
ZeroMemory(&wsaData,sizeof(WSADATA));
int retVal = -1;
if( (retVal = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0 ) {
cout << "WSAStartup Failed::Reason Code::"<< retVal << endl;
return;
}
} { //Create socket
g_ServerSocket = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED); if( g_ServerSocket == INVALID_SOCKET ) {
cout << "Server Socket Creation Failed::Reason Code::" << WSAGetLastError() << endl;
return;
}
} { //bind
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = htonl(INADDR_ANY);
service.sin_port = htons(SERVER_PORT);
int retVal = bind(g_ServerSocket,(SOCKADDR *)&service,sizeof(service));
if( retVal == SOCKET_ERROR ) {
cout << "Server Soket Bind Failed::Reason Code::"<< WSAGetLastError() << endl;
return;
}
} { //listen
int retVal = listen(g_ServerSocket, 8);
if( retVal == SOCKET_ERROR ) {
cout << "Server Socket Listen Failed::Reason Code::"<< WSAGetLastError() << endl;
return;
}
} { // Create IOCP
SYSTEM_INFO sysInfo;
ZeroMemory(&sysInfo,sizeof(SYSTEM_INFO));
GetSystemInfo(&sysInfo);
g_ThreadCount = sysInfo.dwNumberOfProcessors * 1;
g_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,g_ThreadCount);
if (g_hIOCP == NULL) {
cout << "CreateIoCompletionPort() Failed::Reason::"<< GetLastError() << endl;
return;
} if (CreateIoCompletionPort((HANDLE)g_ServerSocket,g_hIOCP,0,0) == NULL){
cout << "Binding Server Socket to IO Completion Port Failed::Reason Code::"<< GetLastError() << endl;
return ;
}
} { //Create worker threads
for( DWORD dwThread=0; dwThread < g_ThreadCount; dwThread++ )
{
HANDLE hThread;
DWORD dwThreadId; hThread = CreateThread(NULL, 0, WorkerThread, 0, 0, &dwThreadId);
CloseHandle(hThread);
}
} { //accept new connection
while(1)
{
SOCKET ls = accept( g_ServerSocket, NULL, NULL );
if(ls == SOCKET_ERROR) break;
cout << "Client connected." << endl; { //diable buffer to improve performance
int nZero = 0;
setsockopt(ls, SOL_SOCKET, SO_SNDBUF, (char *)&nZero, sizeof(nZero));
} if (CreateIoCompletionPort((HANDLE)ls,g_hIOCP,0,0) == NULL){
cout << "Binding Client Socket to IO Completion Port Failed::Reason Code::"<< GetLastError() << endl;
closesocket(ls);
}
else { //post a recv request
IO_DATA * data = new IO_DATA;
ZeroMemory(&data->Overlapped,sizeof(data->Overlapped));
ZeroMemory(data->Buffer,sizeof(data->Buffer));
data->opCode = IO_READ;
data->nTotalBytes = 0;
data->nSentBytes = 0;
data->wsabuf.buf = data->Buffer;
data->wsabuf.len = sizeof(data->Buffer);
data->activeSocket = ls;
DWORD dwRecvNumBytes=0,dwFlags=0;
int nRet = WSARecv(ls,&data->wsabuf, 1, &dwRecvNumBytes,
&dwFlags,
&data->Overlapped, NULL);
if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){
cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(ls);
delete data;
}
}
}
} closesocket(g_ServerSocket);
WSACleanup();
}