Socket编程(一)

Socket编程(一)


socket编程有两种实现方式。第一种是采用socket API ,第二种是采用MFC类库去实现。在这篇文章中,介绍Socket API实现方式

采用Winsock API 编程实现

TCPServer

注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可

@(我的第一个笔记本)

#include <WinSock2.h>
#include <stdio.h>
#include <windows.h>
void   main()
{
    //加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) 
    {
        return ;
    }
    if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) 
    {
        WSACleanup();
        return ;
    }
    //套接字库加载完成
    char sztext[] = "欢迎你\r\n";
    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(10000);
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ::bind(s, (sockaddr*)&addr, sizeof(addr));  //绑定套接字
    ::listen(s, 5);                             //监听套接字
    printf("服务器已经启动\n");                    //输出启动信息
    while (1)
    {
        s1 = ::accept(s, (sockaddr*)&addr2, &n);//接收连接请求
        if (s1 != NULL)
        {
            printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr));
            send(s1, sztext, sizeof(sztext), 0);  //向客户端发送字符
        }
        char recvbuf[100];
        recv(s1, recvbuf, strlen(recvbuf)+1, 0);
        printf("%s\r\n", recvbuf);
        closesocket(s);             //关闭套接字句柄
        closesocket(s1);
        WSACleanup();               //关闭套接字库    
    }
}

TCPClient

注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可

@(代码段)

#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void  main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return;
    }
    if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2)
    {
        WSACleanup();
        return;
    }

    SOCKET s;
    char sztext[10] = { 0 };
    s = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000);
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    printf("客户端已经启动\r\n");
    ::connect(s, (sockaddr*)&addr, sizeof(addr));
    ::recv(s, sztext, sizeof(sztext), 0);
    printf("%s\r\n", sztext);
    ::send(s, "this is client", strlen("this is client") + 1, 0);
    ::closesocket(s);
    ::WSACleanup();
    system("pause");
}

服务端

这里写图片描述
客户端
这里写图片描述

/*************************************************************************************/

UDPServer

注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可

@(代码段)

#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions later    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup();
        return;
    }

    /* The WinSock DLL is acceptable. Proceed. */


    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    sockaddr_in addr, addr2;
    int n = sizeof(addr2);
    char buf[10] = { 0 };

    addr.sin_family = AF_INET;
    addr.sin_port = htons(6000);
    addr.sin_addr.S_un.S_addr = INADDR_ANY;
    bind(s, (sockaddr*)&addr, sizeof(addr));

    printf("UDP服务器已经启动\r\n");
    char sztext[] = "欢迎你\r\n";
    while (1)
    {
        //接收客户端的消息
        if (recvfrom(s, buf, 10, 0, (sockaddr*)&addr2, &n) != 0)
        {
            printf("%s已经连上\r\n", inet_ntoa(addr.sin_addr));
            printf("%s\r\n", buf);

            //发送数据到客户端
            sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr2, n);
            break;
        }
    }
    closesocket(s);
    WSACleanup();
    system("pause");
}

UDPClient

注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可

@ (代码段)

#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions later    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup();
        return;
    }

    /* The WinSock DLL is acceptable. Proceed. */

    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    sockaddr_in addr, addr2;
    int n = sizeof(addr2);
    char buf[10] = { 0 };

    addr.sin_family = AF_INET;
    addr.sin_port = htons(6000);
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    //bind(s, (sockaddr*)&addr, sizeof(addr));

    printf("UDP客户端已经启动\r\n");
    char sztext[] = "你好\r\n";

    //发送信息
    if (sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr,n)!=0)
    {
        recvfrom(s, buf, 10, 0, (sockaddr*)&addr2, &n);//接收消息
        printf("服务器说:%s\r\n", buf);
        closesocket(s);
        WSACleanup();
    }
    system("pause");
}


服务端
这里写图片描述

客户端
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值