代码之家  ›  专栏  ›  技术社区  ›  ggkmath

建立TCP套接字连接时出现问题

  •  2
  • ggkmath  · 技术社区  · 14 年前

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

    我编译时使用: 但是我没有在输出中得到任何提示,也没有在调试时得到任何提示。

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

    除了代码本身之外,还有其他需要满足的需求(可能是系统级的)吗(比如从某个目录运行代码,或者在unix中设置参数以允许连接等等)?因为我是一个硬件爱好者,所以我可能会错过一些明显的东西,所以请随意假设我在做一些愚蠢的事情。我可以运行一个'你好世界'程序很好,这是有帮助的。提前谢谢,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 回复  |  直到 14 年前
        1
  •  7
  •   nos    14 年前
    1. 您已经在main的顶部定义了struct in\u addr和struct sockaddr\u。不要这样做,这些类型在头文件(netinet/in.h)中找到,你必须使用这些类型,而不是你自己的版本。

    2. 换掉那个 exit(2); 具有 {perror("connect"); exit(2); }