实现简单的客户端/服务端通信过程的流程图
首先进行服务端的初始化
a.创建套接字---socket
//Create Socket
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( ServerSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed:"<
//Bind Socket
Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
if ( Ret != 0 )
{
cout<<"Bind Socket Failed:"<
//listen
Ret = listen(ServerSocket, 10);
if ( Ret != 0 )
{
cout<<"listen Socket Failed:"<
然后是客户端的连接
a.客户端建立套接字连接---connect
//Create Socket
ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( ClientSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed:"<
注:客户请求在listen队列中遵循先进先出原则,所以队列满了会导致服务器忙。
然后服务端调用accept()函数接受客户进程的连接
a.服务端---accept
//accept
AddrLen = sizeof(ClientAddr);
ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
if ( ClientSocket == INVALID_SOCKET )
{
cout<<"Accept Failed::"<
注:accept函数调用必须在listen函数之后
然后客户端开始调用send函数发送数据
a.客户端---send//send
cin.getline(SendBuffer, sizeof(SendBuffer));
Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
if ( Ret == SOCKET_ERROR )
{
cout<<"Send Info Error:"<
最后服务端调用recv函数接受数据
a.服务端---recv
//recv
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
getpeername(CientSocket, (struct sockaddr *)&ClientAddr, &AddrLen);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout << "客户" << inet_ntoa(ClientAddr.sin_addr) << " ; " << ClientAddr.sin_port << " quit! " << endl;//客户端退出
break;
}
关闭连接
closesocket(ServerSocket);
closesocket(ClientSocket);
最后附上源码:
Service:
#include
#include
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 3000
#define IP_ADDRESS "192.168.200.1"
DWORD WINAPI ClientThread(LPVOID lpParameter)
{
struct sockaddr_in ClientAddr;
int AddrLen = sizeof(ClientAddr);
SOCKET CientSocket = (SOCKET)lpParameter;
int Ret = 0;
char RecvBuffer[MAX_PATH];
while ( true )
{
//recv
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
getpeername(CientSocket, (struct sockaddr *)&ClientAddr, &AddrLen);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout << "客户" << inet_ntoa(ClientAddr.sin_addr) << " ; " << ClientAddr.sin_port << " quit! " << endl;//客户端退出
break;
}
cout << "客户" << inet_ntoa(ClientAddr.sin_addr) << " ; " << ClientAddr.sin_port <<"---say : " << RecvBuffer << endl;//输出服务端收到的信息
Ret = send(CientSocket, RecvBuffer, (int)strlen(RecvBuffer), 0);//将接收到的字符串回送给客户端
}
return 0;
}
int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET ServerSocket, ClientSocket;
struct sockaddr_in LocalAddr, ClientAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
//Init Windows Socket
if ( WSAStartup(MAKEWORD(2, 2), &Ws) != 0 )
{
cout<<"Init Windows Socket Failed:"<
Client:
#include
#include
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 3000
#define IP_ADDRESS "192.168.200.1"
int main(int argc, char * argv[])
{
WSADATA Ws;
SOCKET ClientSocket;
struct sockaddr_in ServerAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
char SendBuffer[MAX_PATH];
//Init Windows Socket
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
{
cout<<"Init Windows Socket Failed:"<