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

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值