2011-09-14 8 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

言語がない問題を行います。正直:)

これらを2台の別々のPCから実行している場合は、最初に確認するのがファイアウォールです。

SUGGESTIONS:

  1. 特定のクライアント(例えば、あなたのCクライアント)が特定のサーバ(例えば、あなたのCサーバー)に接続することができたシナリオを取得します。

  2. 同じ .exeを問題のあるPCにコピーして、もう一度やり直してください。

  3. 異なる.exeが同じポート#を使用していることを確認してください。あなたが(接続しようとすることは、特にTCP「SYN」パケットクライアントの問題を)行ったり来たりのパケットをトレースすることができるように

  4. また、Wiresharkのを得ることに興味があるかもしれない:

    http://www.wireshark.org

'希望に役立つ!

+0

こんにちはPaulsm4、ありがとうございました。主な問題は、Cのクライアント側が正しいIPアドレスに送信していないことでした。基本的に、gethostname(hostname、sizeof(hostname))は、サーバ側ではなくローカルPCの名前だけを取得します。再度、あなたの助けをありがとう。 –

関連する問題