网络程序在Linux下工作,而不是在Cygwin下
我编写了一个简单的程序,从stdin中读取输入,并通过TCP将其发送到监听端口15557的服务器 当我在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
$ ./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]);