5-客户端程序编写

客户端程序编写

0.初始化网络库

同服务器

WORD wVersionRequested;
WSADATA wsadata;
int err;
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsadata);
if (err)
{
printf("WSAStartup errnum: %d\n", GetLastError());
return err;
}

if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("LOBYTE errnum: %d\n", GetLastError());
WSACleanup();
return -1;
}

1.创建socket

同服务器

1.1 socket

socket可以看成一个文件,向socket发送数据就是向其写入。也可以理解为一个网络连接,或者句柄。

SOCKET sockCli;
1.2向操作系统申请socket

调用socket函数,向操作系统申请一块内存,并将唯一编号返回给socket

  • af:使用的协议簇

    • AF_UNIX:本机通信
    • AF_INET :TCP/UDP ipv4
    • AF_INET6:TCP/UDP ipv6
  • type:使用的套接字类型

    • SOCK_STREAM(TCP流)
    • SOCK_DGRAM(UDP数据报)
    • SOCK_RAW(原始套接字)
  • protocol:在确定协议簇和套接字的情况下,默认为0。在不确定的情况下,可以用于确定协议的种类。

sockCli = socket(AF_INET, SOCK_STREAM, 0);

2.指定地址和端口(服务器的)

使用sockaddr_in,填充地址和端口

客户端必须指定服务器的地址和端口

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("10.7.152.211"); //服务器的ipv4地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(9999); //服务器的端口号

3.连接服务器

使用connect函数将创建好的socket连接到对应的服务器。

if (SOCKET_ERROR == connect(sockCli, (sockaddr*)&addrSrv, sizeof(sockaddr)))
{
printf("%d", GetLastError());
return -1;
}

4.收发数据

char recvBuf[100] = {0};					//创建接收消息区
int iLen = recv(sockCli,recvBuf,100,0); //阻塞等待消息

char sendBuf[100] = "hello";
iLen = send(sockCli,sendBuf,100,0);

5.关闭套接字

closesocket(sockCli);

6.清理网络库

WSACleanup();

完整代码

#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WORD wVersionRequested;
WSADATA wsadata;
int err;
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsadata);
if (err)
{
printf("WSAStartup errnum: %d\n", GetLastError());
return err;
}

if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("LOBYTE errnum: %d\n", GetLastError());
WSACleanup();
return -1;
}

SOCKET sockCli;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("10.7.152.211");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(9999);


if (SOCKET_ERROR == connect(sockCli, (sockaddr*)&addrSrv, sizeof(sockaddr)))
{
printf("%d", GetLastError());
return -1;
}

char recvBuf[100] = { 0 }; //创建接收消息区
int iLen = recv(sockCli, recvBuf, 100, 0); //阻塞等待消息

char sendBuf[100] = "hello";
iLen = send(sockCli, sendBuf, 100, 0);
closesocket(sockCli);
return 0;
}