2011-09-14 221 views
0

即时消息C和C#语言都是新的,我希望对以下问题提供任何帮助/反馈。将C套接字客户端连接到C#套接字服务器

基本上,即时尝试使用不同的编程语言进行套接字连接。客户端已经在C和C#的服务器端开发。只有当我使用相同的编程语言进行测试时,这两种应用程序才能正常工作,例如,如果服务器在C中,则客户端运行良好。在C#中也同样适用服务器端。每当client.c尝试连接错误遇到的是“连接被拒绝”当代码

if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting"); 

这里得到这条线是两个插座端的代码。

client.c

/* Client socket demo */ 
int sockfd, n; 
struct sockaddr_in serv_addr; 
struct hostent *server; 

char buffer[256]; 
char hostname[1024]; 
//hostname[1023] = '\0'; 
struct hostent* h; 
gethostname(hostname, sizeof(hostname)); 
//printf("Hostname: %s\n", hostname); 

server = gethostbyname(hostname); 
//printf("h_name: %s\n", h->h_name); 

//portno = atoi(argv[2]); 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) 
    error("ERROR opening socket"); 
//server = gethostbyname(argv[1]); 
if (server == NULL) { 
    fprintf(stderr,"ERROR, no such host\n"); 
    exit(0); 
} 
bzero((char *) &serv_addr, sizeof(serv_addr)); 
serv_addr.sin_family = AF_INET; // only IPv4 
memcpy(&serv_addr.sin_addr, server->h_addr, server->h_length); // fixed part 
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length); 
serv_addr.sin_port = htons(SERVERPORT); // htons((u_short)port); .sin_addr.S_un.S_addr = htonl(INADDR_ANY) 
//serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting"); 
printf("Please enter the message: "); 
bzero(buffer,256); 
fgets(buffer,255,stdin); 
n = write(sockfd,buffer,strlen(buffer)); 
if (n < 0) 
    error("ERROR writing to socket"); 
bzero(buffer,256); 
n = read(sockfd,buffer,255); 
if (n < 0) 
    error("ERROR reading from socket"); 
printf("here we are %s\n",buffer); 
close(sockfd); 

server.cs

void ButtonStartListenClick(object sender, System.EventArgs e) 
{ 
     try 
     { 
      // Check the port value 
      if(textBoxPort.Text == "") 
      { 
       MessageBox.Show("Please enter a Port Number"); 
       return; 
      } 
      string portStr = textBoxPort.Text; 
      int port = System.Convert.ToInt32(portStr); 

      // Create the listening socket... 
      m_mainSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 

      IPEndPoint ipLocal = new IPEndPoint (IPAddress.Any, port); 

      // Bind to local IP Address... 
      m_mainSocket.Bind(ipLocal); 

      // Start listening... 
      m_mainSocket.Listen(4); 

      // Create the call back for any client connections... 
      m_mainSocket.BeginAccept(new AsyncCallback (OnClientConnect), null); 

      UpdateControls(true); 

     } 
     catch(SocketException se) 
     { 
      MessageBox.Show (se.Message); 
     } 

    } 
+1

那么,连接被拒绝。所以请确保你连接到正确的IP地址和正确的端口。检查你的防火墙设置。 – dtb

回答

1

语言不问题。诚实:)

如果你是从两个独立的PC运行这些,首先要检查的是你的防火墙。

几点建议:

  1. 获取这样一个场景,一个特定的客户端(例如您的C客户端)可以连接到特定的服务器(例如您的C服务器)。

  2. 复制相同的.exe到PC出现问题的地方,然后重试。

  3. 请确保不同的.exe正在使用相同的端口#。

  4. 您可能也有兴趣获得Wireshark的,所以你可以跟踪数据包来回(特别是TCP“SYN”数据包中的客户端问题,尝试连接):

    http://www.wireshark.org

'希望有帮助!

+0

Hi Paulsm4,谢谢你的帮助。主要问题是我的C客户端没有发送到正确的IP地址。基本上,gethostname(主机名,sizeof(主机名))只能获得本地PC的名称,而不是服务器端。再次感谢您的帮助。 –

相关问题