簡單的TCP協議 socket程式設計(C語言版伺服器和客戶端)
阿新 • • 發佈:2019-02-07
最近由於本人對網路程式設計的喜愛,所以對一點關於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()函式時阻塞等待客戶端的連結,然後經過三次握手,成功之後,伺服器和客戶端就可以進行通訊了。
接下來是send()和recv()函式: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...傳送訊息
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);