使用流式套接字实现简单的客户端/服务端通信过程

实现简单的客户端/服务端通信过程的流程图

使用流式套接字实现简单的客户端/服务端通信过程_第1张图片


首先进行服务端的初始化

a.创建套接字---socket

//Create Socket
	ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if ( ServerSocket == INVALID_SOCKET )
	{
		cout<<"Create Socket Failed:"<


b.指定本地地址---bind
//Bind Socket
	Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
	if ( Ret != 0 )
	{
		cout<<"Bind Socket Failed:"<


c.监听连接---listen
//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:"<


 
  
 
 

你可能感兴趣的:(Socket编程基础入门)