'sendto()'函数不会将数据发送到另一台计算机上的应用程序

时间:2014-03-04 04:27:56

标签: sockets posix sendto

我使用linux上的posix套接字api在c中编写了一个客户端应用程序,它将信息发送到服务器,然后将其打印到服务器终端窗口。如果服务器与客户端在同一台机器上,并且客户端发送到环回或其自己的IP地址,那么一切都很好。但是,如果服务器在另一台计算机上运行,​​则sendto会返回“无效参数”错误。

以下是客户端应用程序的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "utils.h"   // for 'errexit()'


#define PEER_PORT 54321
#define BUFFSIZE 100
#define local_net_ip "192.168.0.10"

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

  int clientfd;

  clientfd = socket( AF_INET, SOCK_DGRAM, 0 );
  if( clientfd == -1 )
    errexit( "socket()" );

  struct sockaddr_in servaddr;
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons( PEER_PORT );
  if( inet_pton( AF_INET, local_net_ip, (void *) &(servaddr.sin_addr) ) == -1 )
    errexit( "inet_pton()" );

  char addrStr[ INET_ADDRSTRLEN ];
  inet_ntop( servaddr.sin_family, &(servaddr.sin_addr), addrStr, INET_ADDRSTRLEN );
  printf("Server IPv4 addr:  [ %s ]\n", addrStr);

  char buff[ BUFFSIZE ];
  int writebytes;
  for( ;; ) {

    printf( "Enter text:  ");
    fgets( buff, BUFFSIZE, stdin );

    writebytes = sendto( clientfd, buff, BUFFSIZE, 0, (struct sockaddr *) &servaddr,         sizeof( struct sockaddr_in ) );
    if( writebytes == -1 )
      errexit( "sendto()" );

  }


  exit( EXIT_SUCCESS );

}

我非常感谢有关应用程序无法发送到另一台计算机的任何信息!在此先感谢!!

1 个答案:

答案 0 :(得分:1)

  

clientfd = socket(AF_INET,SOCK_DGRAM,0);

您正在创建一个协议为0的套接字,例如IP。但是后来你使用和IP:端口作为目标。你可能想在这里使用UDP套接字(原型17)。