socket程式設計(一)最簡單的c/s模式
阿新 • • 發佈:2019-01-23
最簡單的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; }