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

建立TCP套接字连接时出现问题,c,sockets,tcp,C,Sockets,Tcp,我不是一个软件人,但我真的需要一些建议 我正在编写一个C程序(下面的剪切/粘贴)来建立一个TCP套接字连接,从我的Mac Pro到它旁边的基于Windows XP的测试仪器,通过LAN(以太网)连接。程序编译时没有任何警告或错误。但是使用GNU调试器执行代码时,我可以看到它在“exit(2)”处退出,这是“if(connect)(MySocket)”行。没有超时,它只是立即退出 我使用以下方法编译: gcc-g-Wall talk2me.c-o talk2me 但我在输出中没有得到任何提示,也没

我不是一个软件人,但我真的需要一些建议

我正在编写一个C程序(下面的剪切/粘贴)来建立一个TCP套接字连接,从我的Mac Pro到它旁边的基于Windows XP的测试仪器,通过LAN(以太网)连接。程序编译时没有任何警告或错误。但是使用GNU调试器执行代码时,我可以看到它在“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;
}
#包括
#包括
#包括
#包括
#包括
#包含//用于inet\u addr
#包含//函数“关闭”
内部主(空)
{
int MySocket;
如果((MySocket=socket(PF_INET,SOCK_STREAM,0))=-1)退出(1);
地址中的结构{
无符号长s_地址;
};
结构sockaddr\u in{
short int sin_family;//地址族
无符号短int sin_port;//端口号
struct in_addr sin_addr;//互联网地址
无符号字符sin_zero[8];//填充
};
MyAddress中的结构sockaddr_;
//将整个结构初始化为零
memset(&MyAddress,0,sizeof(struct-sockaddr_-in));
//然后设置各个字段
MyAddress.sin\u family=PF\u INET;//IPv4
MyAddress.sin_port=htons(5025);//仪器使用的端口号
MyAddress.sin_addr.s_addr=inet_addr(“10.0.1.100”);//IP地址
if(connect(MySocket,(struct sockaddr*)和MyAddress,
sizeof(struct sockaddr_in))=-1)退出(2);
//发送SCPI命令
如果(发送(MySocket,“*IDN?\n”,6,0)=-1)退出(3);
//读取响应
字符缓冲区[200];
int实际值;
如果((实际值=recv(MySocket,&buffer[0],200,0))=-1)退出(4);
缓冲区[actual]=0;//添加零字符(C字符串)
printf(“仪器ID:%s\n”,缓冲区);
//闭合插座
如果(关闭(MySocket)=-1)退出(99);
返回0;
}
  • 您已经在main顶部自己定义了struct in_addr和struct sockaddr_。不要这样做,这些类型可以在头文件(netinet/in.h)中找到,您必须使用它们,而不是您自己的版本

  • 尝试使用telnet从您的mac机顶盒连接到10.0.1.100端口5025,可以吗

  • 退出(2);
    替换为
    {perror(“connect”);退出(2);}
    以获取错误的描述


  • 非常感谢!1.你能给我发送代码,以及你对这些结构的建议更改吗?2.很好的观点。是的,它似乎连接良好:gkk$telnet 10.0.1.100 5025尝试10.0.1.100…连接到10.0.1.100。转义字符为“^]”。3.完成(谢谢!)。结果如下:(gdb)运行启动程序:/Users/gkk/talk2me读取共享库的符号+.done connect():无效参数程序退出,代码为02。-----这是否提供了任何线索?这与Linux无关-已删除标记。