天天看点

一个简单入门的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;

}