2010-08-25 92 views
2

我不是一个软件的人,但我真的可以使用一些建议。问题建立一个TCP套接字连接

我正在写一个C程序(以下剪切/粘贴),建立从我的Mac TCP套接字连接临到基于Windows XP的测试仪器旁边坐了LAN(以太网)。该程序编译时没有任何警告或错误。但是使用GNU Debugger执行代码,我可以看到它在'exit(2)'退出,这就是“if(connect(MySocket)line。没有超时,它只是立即退出。 gcc -g -Wall talk2me.c -o talk2me 但我没有在输出中得到任何提示,也没有在调试时发现可能存在的问题。

我确定10.0.1.100和5025端口是正确的(使用Matlab代码,我可以使用这些参数进行良好的通信)任何想法我可以看到调试吗?

在代码本身之外,是否还有其他要求(可能是系统级别)需要满足fied(如运行某个目录中的代码,或在unix中设置参数以允许连接等)?这可能是明显的,我失踪了,因为我是一个硬件人,所以可以自由地假设我正在做一些愚蠢的事情。我可以运行一个'hello world'程序,这很有帮助。在此先感谢,GGK

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <netinet/tcp.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> //for inet_addr 
#include <unistd.h> // for function 'close' 

int main(void) 
{ 
int MySocket; 
if((MySocket=socket(PF_INET,SOCK_STREAM,0))==-1) exit(1); 

struct in_addr { 
    unsigned long s_addr; 
}; 
struct sockaddr_in { 
short int sin_family; // Address family 
unsigned short int sin_port; // Port number 
struct in_addr sin_addr; // Internet address 
unsigned char sin_zero[8]; // Padding 
}; 
struct sockaddr_in MyAddress; 

// Initialize the whole structure to zero 
memset(&MyAddress,0,sizeof(struct sockaddr_in)); 
// Then set the individual fields 
MyAddress.sin_family=PF_INET; // IPv4 
MyAddress.sin_port=htons(5025); // Port number used by instrument 
MyAddress.sin_addr.s_addr=inet_addr("10.0.1.100"); // IP Address 

if(connect(MySocket,(struct sockaddr *) &MyAddress, 
    sizeof(struct sockaddr_in))==-1) exit(2); 

// Send SCPI command 
if(send(MySocket,"*IDN?\n",6,0)==-1) exit(3); 

// Read response 
char buffer[200]; 
int actual; 
if((actual=recv(MySocket,&buffer[0],200,0))==-1) exit(4); 
buffer[actual]=0; // Add zero character (C string) 
printf("Instrument ID: %s\n",buffer); 

// Close socket 
if(close(MySocket)==-1) exit(99); 

return 0; 
} 
+0

这有什么好做的Linux - 删除标记。 – alternative 2010-08-25 21:26:25

回答

7
  1. 您已经定义结构组in_addr和结构在主顶部有sockaddr_in自己。不要那样做,这些是在头文件(netinet/in.h)中找到的类型,你必须使用那些,而不是你自己的版本。通过telnet从Mac框10.0.1.100端口5025

  2. 尝试连接,运作的?

  3. exit(2);替换为{perror("connect"); exit(2); }以获得有关错误的描述。

+0

非常感谢! 1.您可以向我发送代码,并为这些结构的建议更改吗? 2.好点。是的,这似乎罚款连接: GKK $的telnet 10.0.1.100 5025 试图10.0.1.100 ... 连接到10.0.1.100。 转义字符是'^]'。 3.完成(感谢!)。下面是结果: (GDB)运行 启动程序:/用户/ GKK/talk2me 共享库+阅读的符号。完成 连接():无效的参数 退出的程序代码02. ------ 这是否提供任何线索怎么回事? – ggkmath 2010-08-25 19:58:48

+0

对于1.我刚刚评论了那些struc的,现在它的工作。谢谢!!!!!! – ggkmath 2010-08-25 20:09:12