1. 程式人生 > >網路程式設計 1、TCP客戶端服務端的程式設計模型

網路程式設計 1、TCP客戶端服務端的程式設計模型

  1. 客戶端呼叫虛列
    1. 呼叫socket函式建立套接字
    2. 呼叫connect連結直服務端
    3. 呼叫I/O函式(write/read)與伺服器進行通訊
    4. 呼叫close關閉套接字
//步驟一:建立socket
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0)
	{
		perror("sockert error");
		exit(1);
	}
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_port=htons(atoi(argv[2]));
	//將ip地址轉換成網路位元組序 填入到serveraddr中
	inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr);
//步驟二:connect 連結到伺服器端;
	if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0)
	{
		perror("connect error");
		exit(1);
	}
//步驟三 呼叫I/O函式
//和伺服器斷進行雙向 通訊;
	
	char buffer[1024];
	memset(buffer,0,sizeof(buffer));
	size_t size;
	if((size=read(sockfd,buffer,sizeof(buffer)))<0)
	{
		perror("read error");
		exit(1);
	}
	if(write(STDOUT_FILENO,buffer,size)!=size)
	{
		perror("write error");
	}
//步驟四 關閉套接字
	close(sockfd);
  1. 伺服器端的呼叫序列
    1. 呼叫socket函式來建立套接字
    2. 呼叫bind函式繫結本地的地址和埠(family\port\ip);
    3. 呼叫listen()函式啟動監聽
    4. 呼叫accept函式從已經連線到佇列中 提取客戶連線
    5. 呼叫I/O函式與客戶端進行通訊
    6. 呼叫close關閉套接字
	//步驟一:建立socket
	//建立在核心中;是一個結構體;
	//AF_INET:ipv4  
	//sock_stream :tcp 協議;
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	

	//步驟二:將socket和地址繫結;包括(ip。port等)
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr) );
	//往地址中填入ip  port  internet地址足型別等
	serveraddr.sin_family=AF_INET;//ipv4;
	serveraddr.sin_port=htons(atoi(argv[1]));//port
	serveraddr.sin_addr.s_addr=INADDR_ANY;//"192.168.0.1";//監聽所有的網絡卡上面的客戶端的連結請求;
	if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0)
	{
		perror("bind error");
		exit(1);
	}
	//步驟三  
	//呼叫listen 函式啟動監聽  制定port監聽;
	//通知系統去接受來自客戶端的連結請求;
	//及其昂接受到的客戶端請求放置到對應的佇列中
	//第二個引數: 指定佇列的長度;
	if(listen(sockfd,10)<0)
	{
		perror("listen error");
		exit(1);
	}
	//步驟四:
	//呼叫 accept函式從佇列之中獲得一個客戶端的請求連結
	//並且返回一個新的socket 描述符;針對客戶端的;
	//如果沒有客戶端連結,呼叫這個函式會阻塞,直到獲得一個客戶端的連結;
	struct sockaddr_in clientaddr;
	socklen_t clientaddr_len=sizeof(clientaddr);
	while(1)
	{
		int fd=accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);
		if(fd<0)
		{
			perror("accept error");
			exit(1);
		}
		//步驟五:利用I/O函式(write/read)
	//和連結的客戶端進行雙向的通訊;
	
	out_addr(&clientaddr);
	do_service(fd);

	//步驟6  關閉socket;
	close(fd);
}