1. 程式人生 > >簡單的TCP協議 socket程式設計(C語言版伺服器和客戶端)

簡單的TCP協議 socket程式設計(C語言版伺服器和客戶端)

         最近由於本人對網路程式設計的喜愛,所以對一點關於TCP協議socket程式設計的總結。由於本人的能力有限,寫的可能過於簡單,只適合初學者,歡迎大牛提出寶貴的意見,本人會感激不盡的。廢話少說了,進入正題。(下面程式碼是基於VC6.0)

         下圖是一般socket 程式設計圖。

        

伺服器的建立:

           獲取的本機名,用來解析得到本機的IP地址的;接著就繫結IP地址成功,然後伺服器就處於監聽狀態,等待客戶端的連線。也就是接下來就是TCP/IP的三次握手的操作,該操作成功了伺服器和客戶端就可以進行通訊了。以下是註釋程式碼:

void socketConnect()
{
	char Server_name[128];
	WSADATA wsaData;
	struct hostent *hp;
	struct sockaddr_in addrServer;
	
	WSAStartup(0x202, &wsaData);
	
	sockfd = socket(AF_INET, SOCK_STREAM, 0);   //socket
	gethostname(Server_name, 128);
	hp = gethostbyname(Server_name);           //獲取本機名
	printf("本機名 : %s\n", Server_name);

	memset(&addrServer, 0, sizeof(addrServer));	//初始化
	memcpy(&(addrServer.sin_addr), hp->h_addr, hp->h_length); //設定伺服器的IP地址
	addrServer.sin_family = AF_INET;			//設定版本
	addrServer.sin_port = htons((unsigned short)SERVER_PORT); //設定埠號
	//bind....繫結ip地址和埠號
	if(SOCKET_ERROR == bind(sockfd, (LPSOCKADDR)&addrServer, sizeof(addrServer)))
	{
		printf("Bind socket error!\n");
		//exit(1);
	}
	else
	{
		printf("繫結 socket success...\n");
	}
	listen(sockfd, 5);     //listening...監聽
	printf("伺服器監聽狀態...\n");

	ZeroMemory((void *)&addrtemp, sizeof(addrtemp));
	nlen = sizeof(addrtemp);
	connfd = accept(sockfd, &addrtemp, &nlen);  //accept...三次握手
	printf("accept client success...\n\n");
}

客戶端的建立:

其實客戶端和伺服器程式碼都差不多的,只是最後面的一個connect()函式,就是傳送一個請求連結給伺服器,因為伺服器在accept()函式時阻塞等待客戶端的連結,然後經過三次握手,成功之後,伺服器和客戶端就可以進行通訊了。

WSAStartup(0x202, &wsaData);
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) //socket...
{
	printf("socket error!\n");
	exit(1);
}	
gethostname(Server_name, 128);
host = gethostbyname(Server_name);		//獲取本機名
printf("本機名 : %s\n", Server_name);

memset(&addrServer, 0, sizeof(addrServer)); //初始化
memcpy(&(addrServer.sin_addr), host->h_addr, host->h_length); //設定ip
addrServer.sin_family = AF_INET;							  //設定版本號
addrServer.sin_port = htons((unsigned short)SERVER_PORT);	  //設定埠號

//connect....向伺服器發起連結
if(connect(sockfd, (struct sockaddr *)&addrServer, sizeof(struct sockaddr)))
{
	printf("connect error!\n");
	exit(1);
}
printf("連線伺服器成功connec success...\n\n");
接下來是send()和recv()函式:
//send...傳送訊息
scanf("%s", sendBuf);
getchar();

if( (sendbytes = send(connfd, sendBuf, strlen(sendBuf), 0)) <= 0)
{
	printf("send error !\n");
	continue;
}
memset(sendBuf, 0, sizeof(sendBuf));
//recv...接收訊息
memset(recvBuf, 0, sizeof(recvBuf));
if( (recvbytes = recv(connfd, recvBuf, sizeof(recvBuf), 0)) <= 0)
{
	printf("recv error!\n");
	exit(1);
}
printf("recvbytes = %d\n", recvbytes);
printf("recv from client : %s\n", recvBuf);
    不足之處歡迎指出,共同學習!!