1. 程式人生 > >TCP伺服器端程式(C語言)

TCP伺服器端程式(C語言)

TCP伺服器端程式,與TCP客戶端配合使用

Visual Stdio執行

// TCP客戶端.cpp : 定義控制檯應用程式的入口點。
//
#include"stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32")
using namespace std;
int main()
{
	//WSA是web server API的簡寫

	WSADATA wsaData;
		//給WSAStartup初始化用的資料結構

	printf("init socket ...\n");


	WSAStartup(MAKEWORD(2,2), &wsaData);
	    //MAKEWORD是合成一個字,用來表示版本資訊的
		//指向一個WSADATA的指標。

	printf("init successfully\n");
	printf("create TCP socket...\n");

	SOCKET sLisent = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	//socket函式呼叫成功會返回一個套接字描述符,失敗則返回INVALID_SOCKET
		//呼叫socket時應該使用PF_INET (協議族)
		//指定新套接字描述符的型別  SOCK_STREAM是流套接字
		//指定應用程式所使用的通訊協議
	
	printf("socket create successfully\n");
	
	
	struct sockaddr_in ServerAddr;
	   //sockaddr結構體是為了保持各個特定協議之間的相容性而設計的
	   //是一個用來儲存地址資訊的結構體
	   //為bind()函式指定地址和埠時,向sockaddr_in結構體填充相應的內容
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
		//inet_addr轉換函式把點分十進位制表示的IP地址轉換為in_addr結構體可以接受的型別
	ServerAddr.sin_port = htons(1234);
		//htons() 轉換位元組序
	
	bind(sLisent, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
    //繫結套接字與地址資訊
	    //新建的套接字描述符
		//一個sockaddr的結構體
		//sockaddr結構體的大小

	printf("bind successfully\n");

	listen(sLisent, SOMAXCONN);
	//埠監聽
		//要監聽的套接字描述符
		//允許進入請求連線佇列的個數,其最大值由系統指定,在winsock2.h中,其最大值由SOMAXCONN表示
	sockaddr_in ClientAddr;
	int nSize = sizeof(ClientAddr);
	
	printf("wait for a connection on port %d\n", 1234);


	SOCKET sClient;
	sClient = accept(sLisent, (SOCKADDR *)&ClientAddr, &nSize);
	//獲取連線請求----該函式從請求佇列中獲取連線資訊,建立新的套接字描述符,獲取客戶端地址。新建立的套接字用於和客戶端通訊
		//處於監聽的套接字描述符
		//指向一個sockaddr結構體的指標,用來返回客戶端的地址資訊
		//指向int型的指標變數,用來傳入sockaddr結構體的指標大小
    //sClient獲得接受的套接字描述符
	printf("ClientIP=%s:%d\r\n", inet_ntoa(ClientAddr.sin_addr),
		ntohs(ClientAddr.sin_port));


	char szMsg[MAXBYTE] = { 0 };
	lstrcpy(szMsg, "hello Client!\r\n");
	send(sClient, szMsg, strlen(szMsg) + sizeof(char), 0);
	//傳送訊息
		//accept()函式返回的套接字描述符
		//傳送訊息的緩衝區
		//緩衝區的長度
		//通常賦0
	 
	recv(sClient, szMsg, MAXBYTE, 0);
	//接受訊息
		//使用方法與send相同
	printf("Client Msg : %s \r\n", szMsg);



	WSACleanup();
	system("pause");
	return 0;
}