ؼģͼ
֪ûע.ǿͻ ߷.TCP շݵʱ(send/recv)ܲݾһֱ.Ӷ.ִ.
һ.ǿԿһ߳ȥרŽ.߷.
dz˵.
ֻҪǴֶģ. ˵ݽܲ.
ǿΪ.Dzû᷵..֪ͨ.ǿԱ̽.
÷ģʽ
ioctlsocket(SOCKET s, long cmd, u_long *arpg);
ıģʽ.Ϊshe.
ؼģʽģʽ ģʽ
1.ģʽĵģʽ ָÿֻһ.ֻз굱ǰĿͻ֮.Żһͻ
2.ģʽ ͨ߳.ͬʱ.ûһ̴߳һͻ˵.
ģʽ
1.һ.صַ.
2.һ.רŽһͻ.ҷضӦӵ.
3.ûһͻ˵.ʵֽܸ.
4.رһ.
ʵǽһװ.
´. һ.hļ.ź.һ.cppװӵĴ.
.hļ:
ƴ
#pragma once #include "stdafx.h" #include #include #pragma comment(lib,"ws2_32.lib") using namespace std;
#include "initSocket.h" void DebugLog(TCHAR *str); //ʼ int initSocket(); //1..ַ,ʼ SOCKET BindAnListen(int nBacklog); //ӷװ SOCKET AccepeConnect(SOCKET hSocket); //ܸ BOOL ClientReadAnWriteData(SOCKET hSocket); //ر BOOL ColseConnect(SOCKET hSocket);
ƴ
.cppʵ.
ƴ
#include "initSocket.h" void DebugLog(TCHAR *str)
{
cout << str << WSAGetLastError() << endl;
} //ʼ int initSocket()
{
WSADATA data; if (WSAStartup(MAKEWORD(2, 2), &data))
{
DebugLog(TEXT("initsocket faile")); return 0;
}
} //1..ַ,ʼ SOCKET BindAnListen(int nBacklog)
{ // BOOL bRet = FALSE;
SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == hSocket)
{
DebugLog(TEXT("BindAnListen Fail")); return INVALID_SOCKET;
} // sockaddr_in addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //htonl addr_any addr.sin_family = AF_INET;
addr.sin_port = htons(8524);
bRet = bind(hSocket, (sockaddr *)&addr, sizeof(addr)); if (SOCKET_ERROR == bRet)
{
DebugLog(TEXT("bind fail"));
closesocket(hSocket);
WSACleanup(); return INVALID_SOCKET;
} // bRet = FALSE;
bRet = listen(hSocket, nBacklog); if (SOCKET_ERROR ==bRet)
{
DebugLog(TEXT("Listen fail"));
closesocket(hSocket);
WSACleanup(); return INVALID_SOCKET;
} return hSocket;
} //ӷװ SOCKET AccepeConnect(SOCKET hSocket)
{
sockaddr_in addr; int nSize = sizeof(addr);
SOCKET hNewSocket = accept(hSocket, (LPSOCKADDR)&addr, &nSize); if (hNewSocket == INVALID_SOCKET)
{
DebugLog(TEXT("Accept An Connect Fail")); return INVALID_SOCKET;
} return hNewSocket;
} //ܸ BOOL ClientReadAnWriteData(SOCKET hSocket)
{ char szBuffer[1024] = { NULL }; int nBufferSzie = sizeof(szBuffer); //ѭ int nRecvBytes = 0; do {
nRecvBytes = recv(hSocket,szBuffer, nBufferSzie, 0); if (SOCKET_ERROR == nRecvBytes)
{
DebugLog(TEXT("Recv Data Fail")); return FALSE;
} else if (0 != nRecvBytes)
{
szBuffer[nRecvBytes] = 0;
cout << "ܵΪ: " << szBuffer << endl; //ѭͻȥ. int nSendDataBytes = 0; while (nSendDataBytes < nRecvBytes)
{ int nRetValue = send(hSocket, szBuffer, nBufferSzie, 0); if (nRetValue > 0)
{
nSendDataBytes = nSendDataBytes + nRetValue; //ÿη͵ݶ.ͻᷢȥ } else if (nRetValue == SOCKET_ERROR)
{
DebugLog(TEXT("ʧ")); return FALSE;
} else { //send 0 Ҳsendʧ.ͻ˹ر DebugLog(TEXT("ʧ,ͻѾر")); return FALSE;
}
}
}
} while (0 != nRecvBytes); return FALSE;
}
BOOL ColseConnect(SOCKET hSocket)
{ //shutdown closesocketһ. TCP ᷢһFINֶ.ԷѾݷ if (shutdown(hSocket,SD_SEND) == SOCKET_ERROR)
{
DebugLog(TEXT("رʧ")); return FALSE;
} //ע.ͻ˻ᷢһ.дҲ. return TRUE;
}
ƴ
Ĵֻǰ紴һЩװ.ûʵʱдõĴ.
mainʹ.ֻһsocket
ƴ
// Server.cpp : ̨Ӧóڵ㡣 // #include "initSocket.h" int main()
{ //ʼ initSocket(); //1.Ҽ SOCKET hSocket = BindAnListen(1); if (INVALID_SOCKET == hSocket)
{
DebugLog(TEXT("main Bind Fail")); goto Opt;
} // 2.ѭ while (true) //Ҫ.
{ //ܿͻ SOCKET hRetSocket = AccepeConnect(hSocket); if (INVALID_SOCKET == hRetSocket)
{
DebugLog(TEXT("main accept Fail")); break;
} //ȡ. if (FALSE == ClientReadAnWriteData(hRetSocket))
{ //ֻһsocket.жȡд.Ȼ·йر. break;
} if (ColseConnect(hRetSocket))
{ break;
}
}
Opt:
getchar(); //ȴһ.ۿ ColseConnect(hSocket); return 0;
}