sendto错误:无效参数



我在socket中使用sendto()函数遇到了麻烦

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,"recievedn");
        printf("%sn",sendBuf);
        if(-1 == sendto(acceptFd,sendBuf, 512,0,(struct sockaddr*)&cliaddr,cliLen)){
            perror("sendto() failed");
            continue;
        }
    }
}

recvfrom()工作正常,但每次调用sendto()时,错误处理打印如下:sendto() failed: Invalid argument

发送程序在这里:

#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("%sn",buf);


    return 0;
}

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

From man recvfrom:

在调用之前,它[addrlen]应该初始化为数组的大小与src_addr.

关联的缓冲区

因此,用:

初始化cliLen变量
socklen_t cliLen = sizeof(cliaddr);

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

相关内容

最新更新