Windows Socket API函数的用法及理解 (二)

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


int main()
{
    WSADATA wsadata;
    if (WSAStartup(MAKEWORD(2, 2), &wsadata) != NO_ERROR)
    {
        printf("WSAStartup() 无法初始化!\n");
        return -1;
    }

    SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET)
    {
        printf("socket() 出错!\n");
        WSACleanup();
        return -1;
    }
    
    struct sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_port = htons(27105);
    //unsigned long inet_addr(const char* cp)
    //该函数将点分法IP地址字符串转换为in_addr结构体中的IP地址格式
    //参数cp表示点分法IP地址字符串
    //该函数调用成功返回unsigned long类型的网络字节顺序格式IP地址
    //如果cp不是有效的IP地址字符串,该函数返回INADDR_NONE
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");

    //connect() 函数用于建立到Socket的连接,该Socket必须处于监听状态
    //参数 s:一个未连接的Socket句柄
    //参数 name:指定要建立连接的Socket的名称
    //参数 namelen:指定Socket名的长度
    //该函数调用成功后,返回0;否则返回SOCKET_ERROR
    if (connect(ConnectSocket, (sockaddr*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
    {
        printf("connect() 出错!\n");
        WSACleanup();
        return -1;
    }

    int byteSent;
    int byteRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";

    //send() 函数可以在已连接的Socket上发送数据
    //参数 s:已连接的Socket    参数 buf:包含要发送数据的缓冲区
    //参数 len:buf缓冲区的长度,单位为字节  参数 flags:用于影响函数的行为,0,MSG_DONTROUTE,MSG_OOB
    //函数调用成功,则返回发送数据的字节数,可能小于参数len指定的数据长度;如果出错,返回SOCKET_ERROR
    byteSent = send(ConnectSocket, sendbuf, strlen(sendbuf), 0);
    printf("Bytes Sent: %d\n", byteSent);

    while (byteRecv != SOCKET_ERROR)
    {
        //recv() 函数可以从已连接的Socket中接受数据
        //参数 s:已连接的Socket    参数 buf:用于接受数据的缓冲区
        //参数 len:buf缓冲区的长度,单位为字节  参数 flags:用于影响函数的行为,MSG_PEEK,MSG_OOB
        //函数调用成功,则返回接收数据的字节数;如果连接关闭,返回0;否则返回SOCKET_ERROR
        byteRecv = recv(ConnectSocket, recvbuf, 32, 0);
        if (byteRecv == 0 || byteRecv == WSAECONNRESET)
        {
            printf("Connection Closed!\n");
            break;
        }
        printf("Bytes Recv: %d\n", byteRecv);
    }

    //closesocket() 函数用于关闭一个Socket,释放其占用的资源
    //参数s表示要关闭的Socket,如果没有发生错误函数返回0,否则返回SOCKET_ERROR
    //关闭Socket,如果再引用该Socket将会发生WSAENOTSOCK错误
    closesocket(ConnectSocket);
    WSACleanup();
    return 0;
}
/*
#define ERROR_SUCCESS   0L
#define NO_ERROR        0L  
#define MSG_OOB         0x1             // process out-of-band data
#define MSG_PEEK        0x2             //peek at incoming message

#define INADDR_ANY              (ULONG)0x00000000
#define INADDR_LOOPBACK         0x7f000001
#define INADDR_BROADCAST        (ULONG)0xffffffff
#define INADDR_NONE             0xffffffff
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值