【问题标题】:problem establishing a TCP socket connection建立 TCP 套接字连接的问题
【发布时间】:2010-08-26 05:26:09
【问题描述】:

我不是软件人,但我真的可以参考一些建议。

我正在编写一个 C 程序(在下面剪切/粘贴)以通过 LAN(以太网)建立从我的 Mac Pro 到基于 Windows XP 的测试仪器的 TCP 套接字连接。程序编译时没有任何警告或错误。但是使用 GNU Debugger 执行代码,我可以看到它在“exit(2)”处退出,这是“if(connect(MySocket”) 行。没有超时,它只是立即退出。

我编译使用: gcc -g -Wall talk2me.c -o talk2me 但我在输出中也没有得到任何提示,也没有在调试可能是什么问题时得到任何提示。

我确定 10.0.1.100 和端口 5025 是正确的(使用 Matlab 代码我可以使用这些参数进行正常通信)。知道我还能在哪里调试吗?

在代码本身之外,是否还有其他需要(可能是系统级别的)需要满足(例如从某个目录运行代码,或在 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;
}

【问题讨论】:

  • 这与Linux无关 - 已删除标签。

标签: c sockets tcp


【解决方案1】:
  1. 您已经在 main 的顶部自己定义了 struct in_addr 和 struct sockaddr_in。不要那样做,这些是在头文件(netinet/in.h)中找到的类型,你必须使用那些,而不是你自己的版本。

  2. 尝试使用 telnet 从你的 mac 连接到 10.0.1.100 端口 5025,这样行吗?

  3. exit(2); 替换为 {perror("connect"); exit(2); } 以获得对问题的描述。

【讨论】:

  • 非常感谢! 1. 你能把你对这些结构的建议更改的代码发给我吗? 2. 好点。是的,它似乎连接正常:gkk$ telnet 10.0.1.100 5025 Trying 10.0.1.100... 连接到 10.0.1.100。转义字符是'^]'。 3. 完成(谢谢!)。结果如下: (gdb) 运行启动程序:/Users/gkk/talk2me 读取共享库的符号 +。 done connect(): Invalid argument Program exited with code 02. ------ 这是否提供任何线索?
猜你喜欢
  • 2012-06-17
  • 2012-11-11
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多