Sockets 发送\以udp返回EINVAL

Sockets 发送\以udp返回EINVAL,sockets,networking,server,udp,sendto,Sockets,Networking,Server,Udp,Sendto,我正在创建一个简单的文件传输应用程序,但是当我尝试从服务器端发送到客户端时,send_to返回EINVAL,而send_to和recv_from在客户端都工作正常。 端口号、端口号和主机名作为参数传递 设置服务器的代码: portno=port_number; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) error("ERROR opening socket"); optval

我正在创建一个简单的文件传输应用程序,但是当我尝试从服务器端发送到客户端时,send_to返回EINVAL,而send_to和recv_from在客户端都工作正常。 端口号、端口号和主机名作为参数传递

设置服务器的代码:

portno=port_number;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
      error("ERROR opening socket");


    optval = 1;

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
         (const void *)&optval , sizeof(int));


    bzero((char *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons((unsigned short)portno);


    if (bind(sockfd, (struct sockaddr *) &serveraddr,
       sizeof(serveraddr)) < 0)
      error("ERROR on binding");
      //getsockname(sockfd, (struct sockaddr *)&clientaddr, &clientlen);
      cout<<"server port no"<<serveraddr.sin_port<<endl;
    clientlen = sizeof(clientaddr);
portno=端口号;
sockfd=插座(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
错误(“打开套接字时出错”);
optval=1;
setsockopt(插座FD、SOL_插座、SO_REUSEADDR、,
(const void*)和optval,sizeof(int));
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
serveraddr.sin_port=htons((无符号短)端口号);
if(bind(sockfd,(struct sockaddr*)和serveraddr,
sizeof(serveraddr))<0)
错误(“绑定错误”);
//getsockname(sockfd,(结构sockaddr*)&clientaddr,&clientlen);

coutEINVAL错误是由于无效参数而生成的。因此,您应该像对serveraddr所做的那样初始化ClientAddress,或者如果您之前收到一条HELLO消息/或来自客户端的任何其他消息,您可以将ClientAddress作为参数传递给该recvFrom调用

recvfrom(socketFileDescriptor, buffer, bufferSize,0,(struct sockaddr *) &clientaddr, &clientlen))

如果您是用C编写的,这里的clientlen是
sizeof(clientaddr)

clientaddr
尚未初始化。
  if(sendto (sockfd, ack, strlen(ack), 0,(struct sockaddr*) 
  &clientaddr,sizeof(clientaddr) < 0)
       error("ERROR in sending hello_ACK");
recvfrom(socketFileDescriptor, buffer, bufferSize,0,(struct sockaddr *) &clientaddr, &clientlen))