使用流式套接字实现简单的客户端/服务端通信过程
来源:互联网 发布:美工刀片制作流程 编辑:程序博客网 时间: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);
//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;}
然后是客户端的连接
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
- 【网络编程】使用流式套接字实现简单的客户端/服务端通信过程
- 使用流式套接字实现简单的客户端/服务端通信过程
- 流式套接字实现简单的客户端/服务端通信过程
- 流式套接字实现简单的客户端/服务端通信过程
- 使用简单的ServiceSockt实现服务端与客户端的通信
- 【C++】Winsock套接字编程,简单的TCP/IP通信代码(客户端、服务端)
- 套接字之客户端和服务端的一次通信
- 使用UDP套接字实现简单的通信
- 简单的客户端,服务端通信
- 使用socket实现简单的客户端和服务端通信(C#语言)
- Java简单实现UDP服务端和客户端的通信
- Socket TCP 协议实现服务端和客户端的简单通信
- nodejs socket实现的服务端和客户端简单通信
- Java 利用套接字Socket实现简单的服务器与客户端通信
- Socket套接字:客户端与服务端进行通信
- 简单的Socket通信客户端和服务端
- 客户端和服务端通信的简单小案列
- 简单的服务端与客户端通信代码
- 欢迎使用CSDN-markdown编辑器
- 4. Median of Two Sorted Arrays 【Hard】 分治法
- 10条经典的正能量语录
- BI中的事实表和维度表
- 文章标题
- 使用流式套接字实现简单的客户端/服务端通信过程
- 原生js之滑动轮播图
- Leetcode之Remove Duplicates from Sorted Array II 问题
- <统计学习方法>6 隐马尔可夫模型
- html+js+css实现计算器功能
- leetcode 229. Majority Element II
- KindEditor上传图片
- SpringMVC Controller 介绍
- ActiveMQ简单的HelloWorld实例