基於TCP的socket編程設計

server端需要做的工作(使用系統調用函數):

(1)創建一個socket;                                            用socket()

(2)綁定IP地址、端口等信息到socket上;            用bind()

(3)設置允許的最大連接數                                     用listen()

(4)接收客戶端上來的連接                                     用accept()

(5)收發數據                                                          用recv()和send()或者read()和write()

(6)關閉網絡                                                          用close()

 

server.c

/*
**基於TCP協議的服務器端通信程序
**使用套接口需要執行四個步驟
**(1)分配空間和初始化
**(2)連接
**(3)傳送數據
**(4)關閉
*/

#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define portnumber 3333

int main( int argc, char *argv[] )
{
	int sockfd, temp_fd;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int sin_size;
	int nbytes;
	char buffer[1024];

	/* (1)分配空間和初始化  */
	/* 服務器端開始建立sockfd描述符 */
	if( ( sockfd = socket(AF_INET, SOCK_STREAM, 0) ) == -1 )
	{                  // AF_INET:IPV4;SOCK_STREAM:TCP
		perror("call to socket");
		exit(1);
	}
	/* 服務器端填充 sockaddr結構 */
	bzero( &server_addr, sizeof(struct sockaddr_in) );		//server_addr初始化置0
	server_addr.sin_family = AF_INET;						//internet
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);        //INADDR_ANY 表示主機可以是任意IP地址,即服務器程序可以綁定到所有的IP上
	//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用於綁定到一個固定IP,inet_addr用於把數字加格式的ip轉化爲整形ip
	server_addr.sin_port = htons(portnumber);				// (將本機器上的short數據轉化爲網絡上的short數據)端口號
	
	/*捆綁sockfd描述符到IP地址**/
	if( bind( sockfd, (struct sockaddr *)(&server_addr), sizeof(server_addr) ) == -1 )
	{
		perror("call to bind");
		exit(1);
	}

	/* 設置允許連接的最大客戶端數 */
	if( listen( sockfd, 5 ) == -1 )
	{
		perror("call to listen");
		exit(1);
	}
	printf("Accepting connections ...\n");

	while(1)
	{
		/* 服務器阻塞,直到客戶程序建立連接 */ 
		sin_size = sizeof( struct sockaddr_in );
		temp_fd = accept( sockfd, (struct sockaddr *)( &client_addr ), &sin_size);
		if( temp_fd == -1 )
		{
			perror("call to accept");
			exit(1);
		}
		fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
		if( ( nbytes = read( temp_fd, buffer, 1024 ) ) == -1 )
		{
			perror("call to read");
			exit(1);
		}
		buffer[nbytes] = '\0';
		printf( "Server received %s\n", buffer );
		/**本次通信結束**/
		close(temp_fd);

		/*下次循環*/
	}
	
	/**結束通信**/
	close(sockfd);
	exit(0);

}



  


 client端需要做的操作:

(1)創建一個socket;                                                 用socket()

(2)設置要連接的服務器的IP地址和端口等屬性

(3)連接服務器                                                           用connect()

(4)收發數據                                                               用send()和recv() 或者read()和write()                                                   

(5)關閉網絡                                                               用close()

client.c

/*
**TCP客戶端通信服務程序
**執行時,需要寫入server的ip 
** 如: ./client  115.158.92.170
*/

#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define portnumber 3333

int main( int argc, char *argv[] )
{
	int sockfd;
	char buffer[1024];
	struct sockaddr_in server_addr;
	struct hostent *host;

	if( argc != 2 )
	{	
		fprintf(stderr,"Usage:%s hostname \a\n",argv[0]); 
		exit(1); 	
	}

	/*使用hostname查詢host名字*/
	if( ( host = gethostbyname( argv[1] ) ) == NULL )
	{
		perror("Error resolving local host\n");
		exit(1);
	}

	/* 客戶程序開始建立 sockfd描述符 */ 
	if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
	{
		perror("Error opening socket");
		exit(1);
	}

	/* 客戶端程序填充服務端的資料 */ 
	bzero(&server_addr,sizeof(server_addr));				 // 初始化,置0
	server_addr.sin_family=AF_INET;							 // IPV4
	server_addr.sin_port=htons(portnumber);					 // (將本機器上的short數據轉化爲網絡上的short數據)端口號
	server_addr.sin_addr=*((struct in_addr *)host->h_addr);  // IP地址

	/* 客戶端程序發起連接請求 */ 
	if( connect( sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr) ) == -1)
	{
		perror("Error connecting to socket\n");
		exit(1);
	}

	/* 連接成功了 */ 
	printf("Please input char:\n");

	/* 發送數據 */
	fgets(buffer,1024,stdin); 
	write(sockfd,buffer,strlen(buffer)); 

	/* 結束通訊 */ 
	close(sockfd); 
	exit(0); 

}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章