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

来源:互联网 发布:美工刀片制作流程 编辑:程序博客网 时间:2024/06/07 18:01

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



首先进行服务端的初始化

a.创建套接字---socket

//Create SocketServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ServerSocket == INVALID_SOCKET ){cout<<"Create Socket Failed:"<<GetLastError()<<endl;return -1;}LocalAddr.sin_family = AF_INET;LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);LocalAddr.sin_port = htons(PORT);memset(LocalAddr.sin_zero, 0x00, 8);


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


c.监听连接---listen
//listenRet = listen(ServerSocket, 10);if ( Ret != 0 ){cout<<"listen Socket Failed:"<<GetLastError()<<endl;return -1;}


然后是客户端的连接

a.客户端建立套接字连接---connect

//Create SocketClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ClientSocket == INVALID_SOCKET ){cout<<"Create Socket Failed:"<<GetLastError()<<endl;return -1;}ServerAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);ServerAddr.sin_port = htons(PORT);memset(ServerAddr.sin_zero, 0x00, 8);//client connectRet = connect(ClientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));if ( Ret == SOCKET_ERROR ){cout<<"Connect Error:"<<GetLastError()<<endl;return -1;}else{cout<<"连接成功!"<<endl;}

注:客户请求在listen队列中遵循先进先出原则,所以队列满了会导致服务器忙。

然后服务端调用accept()函数接受客户进程的连接

a.服务端---accept

//acceptAddrLen = sizeof(ClientAddr);ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);if ( ClientSocket == INVALID_SOCKET ){cout<<"Accept Failed::"<<GetLastError()<<endl;break;}

注:accept函数调用必须在listen函数之后

然后客户端开始调用send函数发送数据

a.客户端---send

//sendcin.getline(SendBuffer, sizeof(SendBuffer));Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);if ( Ret == SOCKET_ERROR ){cout<<"Send Info Error:"<<GetLastError()<<endl;break;}


最后服务端调用recv函数接受数据

a.服务端---recv

//recvmemset(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 <iostream>#include <winsock2.h>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 ){//recvmemset(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 Socketif ( WSAStartup(MAKEWORD(2, 2), &Ws) != 0 ){cout<<"Init Windows Socket Failed:"<<GetLastError()<<endl;return -1;}//Create SocketServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ServerSocket == INVALID_SOCKET ){cout<<"Create Socket Failed:"<<GetLastError()<<endl;return -1;}LocalAddr.sin_family = AF_INET;LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);LocalAddr.sin_port = htons(PORT);memset(LocalAddr.sin_zero, 0x00, 8);//Bind SocketRet = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));if ( Ret != 0 ){cout<<"Bind Socket Failed:"<<GetLastError()<<endl;return -1;}//listenRet = listen(ServerSocket, 10);if ( Ret != 0 ){cout<<"listen Socket Failed:"<<GetLastError()<<endl;return -1;}cout<<"服务端已经启动"<<endl;while ( true ){//acceptAddrLen = sizeof(ClientAddr);ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);if ( ClientSocket == INVALID_SOCKET ){cout<<"Accept Failed::"<<GetLastError()<<endl;break;}cout<<"客户端连接: ip.addr : "<<inet_ntoa(ClientAddr.sin_addr)<<" ; port: "<<ClientAddr.sin_port<<endl;hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)ClientSocket, 0 , NULL);if ( hThread == NULL ){cout<<"Create Thread Failed!"<<endl;break;}CloseHandle(hThread);}closesocket(ServerSocket);closesocket(ClientSocket);WSACleanup();return 0;}


Client:

#include <iostream>#include <winsock2.h>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 Socketif ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ){cout<<"Init Windows Socket Failed:"<<GetLastError()<<endl;return -1;}//Create SocketClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ClientSocket == INVALID_SOCKET ){cout<<"Create Socket Failed:"<<GetLastError()<<endl;return -1;}ServerAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);ServerAddr.sin_port = htons(PORT);memset(ServerAddr.sin_zero, 0x00, 8);//client connectRet = connect(ClientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));if ( Ret == SOCKET_ERROR ){cout<<"Connect Error:"<<GetLastError()<<endl;return -1;}else{cout<<"连接成功!"<<endl;}char RecvBuffer[MAX_PATH];//接收到的信息while ( true ){cin.getline(SendBuffer, sizeof(SendBuffer));Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);if ( Ret == SOCKET_ERROR ){cout<<"Send Info Error:"<<GetLastError()<<endl;break;}memset(RecvBuffer, 0x00, sizeof(RecvBuffer));//初始化Ret = recv(ClientSocket, RecvBuffer, MAX_PATH, 0);//接收服务器返回的信息cout << "接收到服务器信息为:" << RecvBuffer << endl;//输出接收到的信息}closesocket(ClientSocket);WSACleanup();return 0;}


 
阅读全文
1 0
原创粉丝点击