建立TCP套接字连接的问题

时间:2010-08-25 18:54:42

标签: c sockets tcp

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

我正在编写一个C程序(下面剪切/粘贴)以建立从我的Mac Pro到基于Windows XP的测试仪器的TCP套接字连接,该测试仪器通过LAN(以太网)坐在它旁边。该程序编译时没有任何警告或错误。但是使用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;
}

1 个答案:

答案 0 :(得分:7)

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

  2. 尝试从mac框连接telnet到10.0.1.100端口5025,这有用吗?

  3. exit(2);替换为{perror("connect"); exit(2); },以获取对错误的描述。