网络程序在Linux下工作,而不是在Cygwin下

网络程序在Linux下工作,而不是在Cygwin下,c,networking,cygwin,C,Networking,Cygwin,我编写了一个简单的程序,从stdin中读取输入,并通过TCP将其发送到监听端口15557的服务器 当我在Linux下编译和运行它时,它工作得很好。但是,当我尝试在Cygwin下编译和运行它时,它失败了,并显示以下错误消息: $ ./a.out servername.net 15557 < test.dat Unable to connect: Cannot assign requested address 我不明白如何解释“>\002V0”字符串。这应该是互联网地址吗 /UPDATE F

我编写了一个简单的程序,从stdin中读取输入,并通过TCP将其发送到监听端口15557的服务器

当我在Linux下编译和运行它时,它工作得很好。但是,当我尝试在Cygwin下编译和运行它时,它失败了,并显示以下错误消息:

$ ./a.out servername.net 15557 < test.dat
Unable to connect: Cannot assign requested address
我不明白如何解释“>\002V0”字符串。这应该是互联网地址吗

/UPDATE

FWIW,整个程序如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>

#include "neurocli.h"

int main(int argc, char* argv[]) {
  char *line = NULL;
  char buf[40] = {0};
  ssize_t write_len = 0, read_len;
  size_t n = 0;
  int neuro_socket;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s host port\n", argv[0]);
    return -1;
  }

  neuro_socket = open_tcp_socket(argv[1], atoi(argv[2]));

  /* Main loop: connect, write, read, re-connect and finally close */
  while ((write_len=getline(&line, &n, stdin)) != -1) {
    printf("# %s", line);
    if (write(neuro_socket, line, write_len) < 0) {
      perror("Unable to write to server");
      exit(EXIT_FAILURE);
    }
    if (*line=='\n') {
      read_len = read(neuro_socket, buf, 40);
      buf[read_len] = '\0';
      printf("%s", buf);
      close(neuro_socket);
      neuro_socket = open_tcp_socket(argv[1], atoi(argv[2]));
    }
    free(line);
    line = NULL; /* getline() needs this */
  }
  free(line);
  close(neuro_socket);
  return 0;
}


int open_tcp_socket(char *server, int port) {
  int result;
  static struct sockaddr_in *sockaddr;

  /* Create socket */
  if ((result = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("Unable to create socket");
    exit(EXIT_FAILURE);
  }

  if (sockaddr==NULL)
    sockaddr = make_sockaddr(server, port); /* never mind the memory leak */

  /* Connect */
  if (connect(result, (struct sockaddr*)sockaddr, sizeof(*sockaddr)) != 0) {
    perror("Unable to connect");
    exit(EXIT_FAILURE);
  }

  return result;
}

struct sockaddr_in *make_sockaddr(char *name, int port) {
  struct sockaddr_in *sockaddr = malloc(sizeof(struct sockaddr_in));
  struct hostent *serverent;

  memset(sockaddr, 0, sizeof(*sockaddr));
  sockaddr->sin_family = AF_INET;
  sockaddr->sin_port = htons(port);

  if ((serverent = gethostbyname(name)) == NULL) {
    perror("Unable to lookup server IP address");
    exit(EXIT_FAILURE);
  }

  sockaddr->sin_addr.s_addr = atoi(serverent->h_addr_list[0]);

  return sockaddr;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“neurocli.h”
int main(int argc,char*argv[]){
char*line=NULL;
char buf[40]={0};
ssize\u t write\u len=0,read\u len;
尺寸n=0;
神经内窝;
如果(argc!=3){
fprintf(stderr,“用法:%s主机端口\n”,argv[0]);
返回-1;
}
neuro_-socket=开放式tcp_-socket(argv[1],atoi(argv[2]);
/*主循环:连接、写入、读取、重新连接并最终关闭*/
while((write_len=getline(&line,&n,stdin))!=-1){
printf(“#%s”,第行);
if(写入(神经插座、线路、写入线)<0){
perror(“无法写入服务器”);
退出(退出失败);
}
如果(*行=='\n'){
read_len=read(神经插座,buf,40);
buf[read_len]='\0';
printf(“%s”,buf);
闭合(神经窝);
neuro_-socket=开放式tcp_-socket(argv[1],atoi(argv[2]);
}
自由线;
line=NULL;/*getline()需要这个*/
}
自由线;
闭合(神经窝);
返回0;
}
int open_tcp_套接字(字符*服务器,int端口){
int结果;
*sockaddr中的静态结构sockaddr_;
/*创建套接字*/
if((结果=套接字(AF_INET,SOCK_STREAM,0))<0){
perror(“无法创建套接字”);
退出(退出失败);
}
if(sockaddr==NULL)
sockaddr=make_sockaddr(服务器、端口);/*不要介意内存泄漏*/
/*连接*/
if(connect(result,(struct sockaddr*)sockaddr,sizeof(*sockaddr))!=0){
perror(“无法连接”);
退出(退出失败);
}
返回结果;
}
结构sockaddr\u in*make\u sockaddr(字符*名称,int端口){
结构sockaddr_in*sockaddr=malloc(sizeof(结构sockaddr_in));
结构hostent*serverent;
memset(sockaddr,0,sizeof(*sockaddr));
sockaddr->sin_family=AF_INET;
sockaddr->sin_port=htons(端口);
if((serverent=gethostbyname(name))==NULL){
perror(“无法查找服务器IP地址”);
退出(退出失败);
}
sockaddr->sin_addr.s_addr=atoi(serverent->h_addr_list[0]);
返回sockaddr;
}
connect()调用失败,因为地址无效。对gethostbyname()的调用很可能返回的结构中没有有用的地址(即h_addr_list[0]==0)

不确定cygwin如何与DNS客户端交互…

这一行

sockaddr->sin_addr.s_addr = atoi(serverent->h_addr_list[0]);
这是不正确的
h\u addr\u list
包含
struct in\u addr
struct in 6\u addr
的地址,长度在
h\u length
中给出,类型可通过
h\u addr type
确定


要获取地址,
memcpy
或将其分配到适当的类型

是您自己的错误消息被打印出来,还是库中的某个内容?如果它是你自己的(即,你自己对
perror
或类似性质的东西的调用),那么你有代码部分吗?@Jason我相信这是由于未能将调用连接到
perror
,距离程序结束大约6行。这不是说“无法查找服务器IP地址”。。。我只是看不到它说“无法建立数据连接”。我假设消息的一部分是传递给
peror
某处的字符串。如果不是,那么我应该看到你的一个字符串,表示对
连接的调用失败。@Jason对不起,你是对的。我正在从内存中复制客户端机器上看到的一行。我现在已经更正了。我已经在GDB下启动了这个程序来检查这一行发生了什么,并用结果更新了这个问题。我必须说,我现在更加困惑,因为该程序在Linux下将不再工作:-o@lindelof:它不是一个字符串,它是一个
struct in_addr
(这在我之前的回答中是错误的,经过更正)您可以分配它,例如
sockaddr->sin_addr=*(struct in_addr*)server ent->h_addr_list[0]我大吃一惊,它起作用了。但是
gethostyname(3)
页面说
gethostbyname
返回一个结构,其
h\u addr\u list
字段是
char**
h\u addr\u list[0]
如何可以强制转换为\u addr*
中的
struct?这可能是。实际上,该程序在Linux下也会失败,尽管是以一种不可预测的方式。请参阅问题的更新。
sockaddr->sin_addr.s_addr = atoi(serverent->h_addr_list[0]);