INADDR_ANY 就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”
服务器有多个网卡,可能每个网卡上有不同的IP地址,所有通过INADDR_ANY发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的
AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的
对应于一个任务进行的每一次WSAStartup()调用,必须有一个WSACleanup()调用.只有最后的WSACleanup()做实际的清除工作;
良好的Windows Sockets应用程序会通过调用WSACleanup()指出它从Windows Sockets实现中注销.本函数因此可以用来释放分配给指定应用程序的资源.
int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
⑴ wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号。
⑵lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets[1] 实现的细节。
WindowsSockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号。
SOCK_STREAM提供面向连接的稳定数据传输,即TCP协议
inet_addr方法可以转化字符串,主要用来将一个十进制的数转化为二进制的数,用途多于ipv4的IP转化
服务器端:
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET server; //服务器socket
SOCKADDR_IN addrSrv;
char sendBuf[100];
char recvBuf[100];
SOCKADDR_IN addrClient;
SOCKET client; //连接的客户端socket
int len;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("start up failed!\n");
return;
}
server = socket(AF_INET, SOCK_STREAM, 0); //创建socket
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //设置地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000); //设置端口号
bind(server, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //绑定
listen(server, 5); //设置最多连接数
len = sizeof(SOCKADDR);
while (1)
{
client = accept(server, (SOCKADDR*)&addrClient, &len); //接收客户端连接
send(client, "123徐海涛hunk xu", strlen(sendBuf) + 1, 0); //发送信息客户端
recv(client, recvBuf, 100, 0); //接收客户端数据
printf("%s\n", recvBuf);
closesocket(client);
}
closesocket(client); //关闭连接
WSACleanup();
}
客户端:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET sockClient; //客户端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("start up failed!\n");
return;
}
sockClient = socket(AF_INET, SOCK_STREAM, 0); //创建socket
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //连接服务器端
recv(sockClient, recvBuf, 100, 0); //接收服务器端数据
send(sockClient, "hello world", strlen("hello world") + 1, 0); //向服务器端发送数据
closesocket(sockClient); //关闭连接
WSACleanup();
printf(recvBuf);
system("pause");
}
我使用的是VS2015控制台程序运行的
注意:要分别为客户端和服务器端建立两个控制台应用程序,然后分别 生成和运行
FR:海涛高软(hunk Xu) QQ技术交流群:386476712