TCP伺服器端程式(C語言)
阿新 • • 發佈:2018-12-13
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; }