2010-08-25 3 views
2

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

Я пишу программу 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, я могу прекрасно общаться с этими параметрами). Любая идея, где еще я мог бы отлаживаться?

За пределами самого кода существуют ли какие-либо другие требования (возможно, системные уровни), которые должны быть удовлетворены fied (например, запуск кода из определенного каталога или установка параметра в unix для разрешения соединений и т. д.)? Это может быть что-то очевидное, что мне не хватает, потому что я парень-аппаратчик, поэтому не стесняйтесь предполагать, что я делаю что-то глупое. Я могу запустить программу «hello world», это помогает. Спасибо заранее, ГКИ

#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

ответ

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

  2. Попробуйте установить соединение с telnet с вашего mac box на 10.0.1.100 порт 5025, это работает?

  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) run Стартовая программа:/Пользователи/gkk/talk2me Чтение символов для разделяемых библиотек +. done connect(): Неверный аргумент Программа вышла с кодом 02. ------ Означает ли это, что происходит? – ggkmath

+0

Для 1. Я просто прокомментировал эти структуры и теперь это работает. СПАСИБО!!!!!! – ggkmath