recv()和send()函数

结论是实验得来,没有很严谨的查阅资料,注意recv()函数后面的注释就好
这是简单的服务器端代码

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

void main()
{
    //用WSAStartup初始化套接字,分配网络资源。即网络层以下部分资源
    WSADATA wsaData;
    WORD wVersionRequested = MAKEWORD(1, 1);//WORD是16位无符号整形,详见WINDOWS常见数据类型,此处用于指定初始化的版本号
    int err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return;//初始化不成成功
    }
    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)//若初始化的版本号不对
    {
        WSACleanup();
        return;
    }

    //创建套接字,套接字需要手动关闭
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//此处第一、第三个参数是固定的,第二个参数是TCP的写法,UDP是SOCK_DGRAM
    if (INVALID_SOCKET == sockSrv)//这种写法比较容易发现==写错的情况
    {
        WSACleanup();
        return;
    }

    //绑定到6000端口

    SOCKADDR_IN addrSrv;//此处是TCP/IP必须使用的数据类型
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//此处指定服务器监听的网卡,此参数下监听所有网卡的所有地址,htonl用于把一个数变成一个网址
    addrSrv.sin_port = htons(6000);//绑定端口6000
    addrSrv.sin_family = AF_INET;//TCP/IP

    err = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
    if (0 != err)
    {
        WSACleanup();
        return;
    }

    //监听客户请求
    listen(sockSrv, SOMAXCONN);//最大监听的个数

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);
    while (1)
    {
        //接收客户端请求,得到客户端信息,是一个阻塞函数
        SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
        //向客户端发数据
        char sendBuf[100];
        sprintf(sendBuf, "im 网管,你是%s", inet_ntoa(addrClient.sin_addr)); 
        send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//第二个参数是要发送的数据,第三个参数是此套接字缓冲区的大小

        //接收数据
        char recvBuf[100];
        int nRecv = recv(sockConn, recvBuf, 100, 0);//返回值代表接收到的字符长度,接收到的字符长度应是对方套接字的缓冲区那么大,也就是说,send一次就会send  client的套接字里缓冲区的所有内容,
        printf("%s\n", recvBuf);
        //关闭客户端连接
        closesocket(sockConn);

    }

    //关闭服务器连接
    closesocket(sockSrv);

    WSACleanup();

}

下面是简单的客户端代码

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

void main()
{
    WSADATA wsaData;
    int err = WSAStartup(0x0101, &wsaData);
    if (err != 0)
        return;


    SOCKET sockConn = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_port = htons(6000);
    addrSrv.sin_family = AF_INET;
    connect(sockConn, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    char recvBuf[100];
    int nRecv = recv(sockConn, recvBuf, 100, 0);
    recvBuf[nRecv] = '\0';

    printf("%s\n", recvBuf);

    send(sockConn, "hello there", 100,0);
    closesocket(sockConn);
    WSACleanup();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值