首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendto错误:无效参数

sendto错误:无效参数
EN

Stack Overflow用户
提问于 2015-08-23 12:16:47
回答 2查看 2K关注 0票数 1

我很难在套接字中使用sendto()函数

代码语言:javascript
复制
int main(int argc, const char * argv[]) {

    int acceptFd;
    struct sockaddr_in servaddr, cliaddr;
    char recieveBuf[512];
    char sendBuf[512];
    socklen_t cliLen;

    if(-1 == (acceptFd = socket(AF_INET,SOCK_DGRAM,0))) perror("socket() failed.\n");
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6789);
    if(-1==bind(acceptFd,(struct sockaddr*)&servaddr,sizeof(servaddr))) perror("bind() failed.\n");


    bzero(&cliaddr, sizeof(cliaddr));

    while(1){


        if(recvfrom(acceptFd, recieveBuf, 512, 0, (struct sockaddr*) &cliaddr, &cliLen) == -1) {
            perror("recvfrom() failed");
            continue;
        }

        strcpy(sendBuf,"recieved\n");
        printf("%s\n",sendBuf);
        if(-1 == sendto(acceptFd,sendBuf, 512,0,(struct sockaddr*)&cliaddr,cliLen)){
            perror("sendto() failed");
            continue;
        }
    }
}

recvfrom()工作正常,但是每次调用sendto()时,错误处理都会输出如下:sendto() failed: Invalid argument

发送程序在这里:

代码语言:javascript
复制
#include "test.AcceptMessage.pb.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(int argc, const char * argv[]) {



    int sendSocket;
    struct sockaddr_in cliaddr;
    char buf[512];
    if(-1 == (sendSocket = socket(AF_INET,SOCK_DGRAM,0))) perror("socket() failed.\n");
    bzero(&cliaddr, sizeof(cliaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cliaddr.sin_port = htons(6789);

    sendto(sendSocket,buf, 512,0,(
            struct sockaddr*)&cliaddr, sizeof(cliaddr));



    recvfrom(sendSocket,buf,512,0, nullptr, nullptr);
    printf("%s\n",buf);





    return 0;
}

那么这个代码有什么问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-23 12:50:52

来自man recvfrom

在调用之前,应该将addrlen初始化为与src_addr关联的缓冲区大小。

因此,使用以下方法初始化cliLen变量:

代码语言:javascript
复制
socklen_t cliLen = sizeof(cliaddr);
票数 3
EN

Stack Overflow用户

发布于 2015-09-05 06:01:12

您根本没有理由在这里使用recvfrom()sendto()。是一个连接的插座。只需使用send()recv().

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32166542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档