天天看點

一個簡單入門的win32 socket程式

一個簡單入門的win32 socket程式

為了給學生上課,要寫個簡單的聊天程式。先是在網上搜尋,結果不是很滿意。自己動手,豐衣足食。自己用一個現成的程式修改并加了注釋。其實,一個技術入門是一個坎,對于門外漢,有些很簡單的東西都覺得難以了解。是以下面給出了詳細的步驟和解釋,程式可以直接運作。

程式功能:單方向,用戶端給伺服器發文字

運作環境:vc++6.0,windows xp通過

運作時首先運作伺服器端,再運作用戶端

用戶端程式:

首先運作VC,

然後建立“項目->Win32 Console Application->Anempty project”

再建立“檔案->C++ Source File(檔案名為server)”

在建好的C++ 源檔案中輸入下列代碼,然後編譯運作

#include <WINSOCK2.H>

#include <stdio.h>

//定義程式中使用的常量

#define SERVER_ADDRESS "127.0.0.1" //伺服器端IP位址

#define PORT 5150 //伺服器的端口号

#define MSGSIZE 1024 //收發緩沖區的大小

#pragma comment(lib,"ws2_32.lib")

int main()

{

WSADATA wsaData;

SOCKET sClient; //連接配接所用套節字

SOCKADDR_IN server; //儲存遠端伺服器的位址資訊

char szMessage[MSGSIZE]; //收發緩沖區

int ret; //成功接收位元組的個數

// Initialize Windows socket library

WSAStartup(0x0202, &wsaData);

// 建立用戶端套節字

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET指明使用TCP/IP協定族;

//SOCK_STREAM, IPPROTO_TCP具體指明使用TCP協定

// 指明遠端伺服器的位址資訊(端口号、IP位址等)

memset(&server, 0, sizeof(SOCKADDR_IN)); //先将儲存位址的server置為全0

server.sin_family = PF_INET; //聲明位址格式是TCP/IP位址格式

server.sin_port = htons(PORT); //指明連接配接伺服器的端口号,htons()用于 converts values between the host and network byte order

server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明連接配接伺服器的IP位址

//結構SOCKADDR_IN的sin_addr字段用于儲存IP位址,sin_addr字段也是一個結構體,sin_addr.s_addr用于最終儲存IP位址

//inet_addr()用于将 形如的"127.0.0.1"字元串轉換為IP位址格式

//連到剛才指明的伺服器上

connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //連接配接後可以用sClient來使用這個連接配接

//server儲存了遠端伺服器的位址資訊

while (TRUE)

{

printf("Send:");

//從鍵盤輸入

gets(szMessage); //The gets() functionreads characters from stdin and loadsthem into szMessage

// 發送資料

send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪個連接配接發送; szMessage指明待發送資料的儲存位址 ;strlen(szMessage)指明資料長度

}

// 釋放連接配接和進行結束工作

closesocket(sClient);

WSACleanup();

return 0;

}

伺服器端程式:

再運作一個VC視窗,

然後建立“項目->Win32 ConsoleApplication->An empty project”

再建立“檔案->C++ Source File(檔案名為server)”

在建好的C++ 源檔案中輸入下列代碼,然後編譯運作

#include <WINSOCK2.H>

#include <stdio.h>

#define PORT 5150

#define MSGSIZE 1024

#pragma comment(lib,"ws2_32.lib")

int main()

{

WSADATA wsaData;

SOCKET sListen;

SOCKET sClient;

SOCKADDR_IN local;

SOCKADDR_IN client;

char szMessage[MSGSIZE];

int ret;

int iaddrSize = sizeof(SOCKADDR_IN);

WSAStartup(0x0202, &wsaData);

sListen = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

local.sin_family = AF_INET;

local.sin_port = htons(PORT);

local.sin_addr.s_addr = htonl(INADDR_ANY);

bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));

listen(sListen, 1);

sClient = accept(sListen, (structsockaddr *)&client, &iaddrSize);

printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr),ntohs(client.sin_port));

while (TRUE)

{

ret = recv(sClient, szMessage, MSGSIZE, 0);

szMessage[ret] = '\0';

printf("Received [%d bytes]: '%s'\n", ret, szMessage);

}

return 0;

}