Win32 下使用SOCKET API函数进行网络开发的基本流程与方法
1、初始化和释放套接字库
2、创建套接字句柄
3、绑定地址信息
4、连接
5、数据收发
6、关闭套接字
下面介绍基于TCP的Sockets编程
TCP服务器
#include<winsock2.h>
#include<stdio.h>
#include<Windows.h>
#pragma comment(lib,"WS2_32.lib")
int main()
{
WSADATA data; //定义WADATA结构体对象
WORD w=MAKEWORD(2,0); //定义版本号
char sztext[]="欢迎你\r\n"; //定义并初始化发送到客户端的字符数
::WSAStartup(w,&data);//初始化套接字库
SOCKET s,s1; //定义连接套接字和数据收发套接字句柄
s=::socket(AF_INET,SOCK_STREAM,0);//创建TCP套接字
sockaddr_in addr,addr2; //定义套接字地址结构
int n=sizeof(addr2);//获取套接字地址结构大小
addr.sin_family=AF_INET; //初始化地址结构
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr*)&addr,sizeof(addr));//绑定套接字
::listen(s,5); //监听套接字
printf("服务器已经启动\r\n"); //输出提示信息
while(true)
{
s1=::accept(s,(sockaddr*)&addr2,&n); //接收连接请求
if(s1!=NULL)
{
printf("%s已经连接上\r\n",inet_ntoa(addr2.sin_addr));
::send(s1,sztext,sizeof(sztext),0);//向客户端发送字符数组
}
::closesocket(s);//关闭套接字句柄
::closesocket(s1);
::WSACleanup(); //释放套接字库
if(getchar())
{
return 0;
}
else
{
::Sleep(100); //应用睡眠0.1秒
}
}
}
TCP客户端
#include<winsock2.h>
#include<stdio.h>
#include<Windows.h>
#pragma comment(lib,"WS2_32.lib")
int main()
{
WSADATA data; //定义WADATA结构体对象
WORD w=MAKEWORD(2,0); //定义版本号
//char sztext[]="欢迎你\r\n"; //定义并初始化发送到客户端的字符数
::WSAStartup(w,&data);//初始化套接字库
//SOCKET s,s1; //定义连接套接字和数据收发套接字句柄
SOCKET s;
char sztext[10]={0};
s=::socket(AF_INET,SOCK_STREAM,0);//创建TCP套接字
//sockaddr_in addr,addr2; //定义套接字地址结构
sockaddr_in addr;
//int n=sizeof(addr2);//获取套接字地址结构大小
addr.sin_family=AF_INET; //初始化地址结构
addr.sin_port=htons(75);
//addr.sin_addr.S_un.S_addr=INADDR_ANY;
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
printf("客户端已经启动\r\n"); //输出提示信息
//::bind(s,(sockaddr*)&addr,sizeof(addr));//绑定套接字
//::listen(s,5); //监听套接字
::connect(s,(sockaddr*)&addr,sizeof(addr));
::recv(s,sztext,sizeof(sztext),0);
//printf("服务器已经启动\r\n"); //输出提示信息
//while(true)
printf("%s\r\n",sztext);
::closesocket(s);//关闭套接字句柄
//::closesocket(s1);
::WSACleanup(); //释放套接字库
if(getchar())
{
return 0;
}
else
{
::Sleep(100); //应用睡眠0.1秒
}
//}
}