проблема с установлением соединения через сокет TCP - PullRequest
2 голосов
/ 25 августа 2010

Я не специалист по программному обеспечению, но я мог бы действительно использовать некоторые советы.

Я пишу C-программу (вырезать / вставить ниже), чтобы установить соединение через сокет TCP от моего Mac Pro к тестовому устройству на базе Windows XP, находящемуся рядом с ним по локальной сети (Ethernet). Программа компилируется без каких-либо предупреждений или ошибок. Но, выполняя код с использованием GNU Debugger, я вижу, что он завершается в 'exit (2)', что является строкой "if (connect (MySocket"). Тайм-аута нет, просто сразу выходит.

Я компилирую, используя: gcc -g -Wall talk2me.c -o talk2me но я не получаю никаких подсказок ни в выводе, ни при отладке, в чем может быть проблема.

Я уверен, что 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 Ответ

7 голосов
/ 25 августа 2010
  1. Вы определили struct in_addr и struct sockaddr_in вверху main. Не делайте этого, это типы, найденные в заголовочных файлах (netinet / in.h), вы должны использовать их, а не свои собственные версии.

  2. Попробуйте подключиться через telnet от вашего компьютера Mac к порту 1025.1.100 5025, это работает?

  3. замените это exit(2); на {perror("connect"); exit(2); }, чтобы получить описание того, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...