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