一個簡單入門的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;
}