MSYS 下winsocket 简单使用

2021-05-08  本文已影响0人  wjundong

udp 客户端测试

#include <stdio.h>
#include<winsock2.h>

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char const *argv[])
{
    /* 初始化套接字动态库 */
    WSADATA data;
    if (WSAStartup(MAKEWORD(2, 2), &data) != 0)
    {
        printf("WSAStartup error\n");
        return -1;
    }

    /* 创建网络套接字 */
    SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sclient == INVALID_SOCKET)
    {
      printf("invalid socket!");
      return 0;
    }

    /* 设置服务器地址信息  */
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8888);
    serv_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    int serv_addr_len = sizeof(serv_addr);

    while (1)
    {
        int ch = getchar();
        
        char buf[512];
        int n = 0;

        /* 接收数据 */
        if (ch == 'R' || ch == 'W')
        {
again:
            n = recvfrom(sclient, buf, 512 - 1, 0, (struct sockaddr *)&serv_addr, &serv_addr_len);
            
            if(n < 0)
            {
                printf("recv error\n");
                goto err;
            }
            buf[n] = '\0';
            printf("recv %d bytes: %s\n", n, buf);

            /* 循环接收 */
            if(ch == 'W')
            {
                goto again;
            }
        }

        /* 发送数据 */
        else if (ch == 'S')
        {
            n = sendto(sclient, "Hello", 6, 0, (struct sockaddr *)&serv_addr, serv_addr_len);

            if (n < 0)
            {
                printf("sendto error\n");
                goto err;
            }
            
        }

        /* 退出测试 */
        else if(ch == 'E')
        {
            break;
        }
    }

err:
    closesocket(sclient);
    WSACleanup();
    
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读