最简单的C/S模式是经典的入门模式,也是大多数教材讲解最多的,总的来说分为下面的几个步骤
左边为 客户端模式,右边为服务器模式
服务器模式相对复杂一点,这一点是肯定的,因为服务器面对很多不同的客户端的连接。
相关函数不解释,入门级别的书本上都有,而且讲解的非常详细。
这里不多做介绍!
下面是服务器模式,只负责接收信息
#include <iostream> #include <WINSOCK2.H> #pragma comment(lib,"Ws2_32.lib") using namespace std; int main(int argc, char* argv[]) { char buff[255]; WSADATA wsa; //初始化套接字库 if ( WSAStartup( MAKEWORD(2,2) , &wsa ) ) { cout<<"1!"<<endl; } //初始化套接字和本机服务器的地址 SOCKET server_socket = socket(AF_INET , SOCK_STREAM , 0); SOCKADDR_IN serveradd; serveradd.sin_family = AF_INET; serveradd.sin_port = htons(8000); serveradd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //绑定 if(bind(server_socket , (SOCKADDR *)&serveradd , sizeof(serveradd)) == SOCKET_ERROR) { cout<<"2"<<endl; WSACleanup(); } //监听端口 if(listen(server_socket , 5) == SOCKET_ERROR) { cout<<"3"<<endl; WSACleanup(); } //定义地址等待客户端的连接 SOCKADDR_IN clientadd; int len = sizeof(clientadd); int irecv = 0 ; //连接 SOCKET client_sock = accept(server_socket , (SOCKADDR *)&clientadd , &len); while (1) { //循环 接受 用于测试! irecv = recv(client_sock , buff , 255 , 0); if (irecv == 0 || irecv == SOCKET_ERROR ) { break; } cout<<buff<<endl; } return 0; }
继续贴出客户端的例子
客户端只是发送数据
#include <iostream> #include <WINSOCK2.H> #pragma comment(lib,"Ws2_32.lib") using namespace std; int main(int argc, char* argv[]) { char buff[255]; //初始化套接字库 WSADATA wsa; if ( WSAStartup( MAKEWORD(2 , 2) , &wsa ) ) { cout<<"WSAStartup error !"<<endl; } //创建套接字 SOCKET client_socket = socket( AF_INET , SOCK_STREAM , 0 ); if (client_socket == INVALID_SOCKET) { cout<<"创建套接字失败"<<endl; } //定义服务器地址 SOCKADDR_IN server_addr; server_addr.sin_family = AF_INET ; server_addr.sin_port = htons(8000); server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //连接服务器 int ret = connect(client_socket ,(SOCKADDR *)&server_addr , sizeof(server_addr)); if (ret == SOCKET_ERROR ) { cout<<"连接失败"<<endl; } while (1) { cin>>buff; send(client_socket , buff , strlen(buff)+1 , 0 ); Sleep(1000); } return 0; }