视觉空间 2023-12-19 16:59 采纳率: 0%
浏览 5

c语言实现udp 客户端sendto报10014问题

运行客户端输入发送数据后报10014,不知道怎么解决,麻烦各位帮忙看下。

服务端:

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

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

#include <sys/types.h>

#include <Ws2tcpip.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <io.h>
#include <process.h>

#define SERVER_PORT 6677
#define ERROR -1

int main()
{
    int udpServerSocket;

    struct sockaddr_in server_addr;

    struct sockaddr_in client_addr;

    //启动wsaData服务
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        perror("WSADATA失败");
    }

    //判断socket是否失败
    if ((udpServerSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("socketError = %d\n", WSAGetLastError());
        return ERROR;
    }
    printf("udpServerSocket的值为:%d\n", udpServerSocket);

    //初始化服务器地址
    memset(&server_addr, 0, sizeof(server_addr));

    //初始化服务器端套接字并用htons和htonl将端口和地址转成网络字节序
    server_addr.sin_family = AF_INET;

    server_addr.sin_port = htons(SERVER_PORT);

    //ip可以是本服务器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //判断bind是否失败
    int udpBind;
    if (udpBind = bind(udpServerSocket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
    {
        printf("bindError = %d\n", WSAGetLastError());
        return ERROR;
    }
    printf("udpBind的值为:%d\n", udpBind);

    while (1)
    {
        printf("监听端口:%d\n", SERVER_PORT);

        char buffer[200];
        memset(buffer, 0, sizeof(buffer));

        printf("读取消息:");
        //udpRecvfrom为recvfrom函数返回的数据长度
        //int udpRecvfrom;

        int client_addr_len = sizeof(client_addr);
        if (recvfrom(udpServerSocket, buffer, strlen(buffer), 0, (struct sockaddr*)&client_addr, &client_addr_len) < 0)
        {
            printf("recvfromError = %d\n", WSAGetLastError());
            return ERROR;
        }
        //buffer[udpRecvfrom] = '\0';
        printf("%s\n", buffer);

        //增加退出机制
        if (strcmp(buffer, "quit") == 0)
            break;
        memset(buffer, 0, sizeof(buffer));
        

        printf("发送消息:");
        scanf("%s", buffer);
        printf("\n");

        int udpSendto;
        if (udpSendto = (sendto(udpServerSocket, buffer, strlen(buffer), 0, (struct sockaddr*)&client_addr, client_addr_len)) < 0)
        {
            printf("sendtoError = %d\n", WSAGetLastError());
            return ERROR;
        }
        memset(buffer, 0, sizeof(buffer));

        //增加退出机制
        if (strcmp(buffer, "quit") == 0)
            break;
    }
    close(udpServerSocket);
    return 0;
}

客户端:

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

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

#include <sys/types.h>

#include <Ws2tcpip.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <io.h>
#include <process.h>

#define SERVER_PORT 6677
#define ERROR -1

int main()
{
    //启动wsaData服务
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        perror("WSADATA失败");
    }
    
    //描述服务器的socket
    struct sockaddr_in server_addr;

    //指定服务器端的ip,本地测试:127.0.0.1
    //inet_addr()函数,将点分十进制IP转换成网络字节序IP
    //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    char buffer[200];

    int udpClientSocket;

    int addrLen = sizeof(server_addr);

    //判断socket是否失败
    if ((udpClientSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("socketError = %d\n", WSAGetLastError());
        return ERROR;
    }
    printf("udpClientSocket的值为:%d\n", udpClientSocket);    

    //初始化服务器地址
    memset(&server_addr, 0, sizeof(server_addr));

    //初始化服务器端套接字并用htons和htonl将端口和地址转成网络字节序
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    //ip可以是本服务器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址,自动绑定ip
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    //设置服务器地址信息
    /*if (inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)) <= 0)
    {
        perror("Failed to set server IP");
        return ERROR;
    }*/

    

    while (1)
    {
        memset(buffer, 0, sizeof(buffer));
        printf("发送消息:");
        scanf("%s", buffer);
        printf("\n");

        //int udpSendto;
        if (sendto(udpClientSocket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr) < 0))
        {
            printf("sendtoError = %d\n", WSAGetLastError());
            perror("sendtoError");
            return ERROR;
        }
        memset(buffer, 0, sizeof(buffer));
        //增加退出机制
        if (strcmp(buffer, "quit") == 0)
            break;


        printf("读取消息:");
        //udpRecvfrom为recvfrom函数返回的数据长度
        //int udpRecvfrom;
        if (recvfrom(udpClientSocket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, (socklen_t*)addrLen) < 0)
        {
            printf("recvfromError = %d\n", WSAGetLastError());
            return ERROR;
        }
        //recvbuf[udpRecvfrom] = '\0';
        memset(buffer, 0, sizeof(buffer));
        //增加退出机制
        if (strcmp(buffer, "quit") == 0)
            break;

    }
    close(udpClientSocket);
    return 0;
}

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-26 03:54
    关注

    【相关推荐】



    • 这篇博客: 记一次UDP的sendto函数错误解决中的 总结: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
      • 变量使用之前最好初始化。

      • 注意判断函数的返回值,可以使用包裹函数。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月19日

悬赏问题

  • ¥15 手机应用程序安装异常
  • ¥15 grbl的G92修改MPos的问题。
  • ¥15 vue2中,Ant Design Pro s-table中,使用服务端排序怎么做
  • ¥15 阿里巴巴国际站的商品详细页如何做到图文分离
  • ¥15 根据质因子个数求因式个数
  • ¥15 matlab模糊控制隶属函数设计
  • ¥15 DB2的REPLACE函数报错求解
  • ¥45 C++上传文件到SFTP
  • ¥20 组态王 海康Vision Master
  • ¥15 思科WS-C4503-E核心交机