1. 程式人生 > >socket程式設計(一)最簡單的c/s模式

socket程式設計(一)最簡單的c/s模式

      最簡單的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;
}