2013-08-29 2 views
0

Здесь я хотел бы спросить, как создать связь через программирование сокетов между клиентом (на Windows, используя C# .NET) и сервером (на Ubuntu, используя C). Я сделал успешно, если сервер-клиент либо является C# .NET, либо C, но не имеет никакого представления, как я спросил. Я попытался найти информацию на нескольких сайтах, но не смог найти ее. Я ценю любые комментарии. Спасибо.Программирование сокетов между клиентом на C# .NET и сервером в C

Вот простые коды на клиенте.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 

namespace WindowsFormsApplication9 
{ 
    public partial class Form1 : Form 
    { 
     // Receiving byte array 
     byte[] bytes = new byte[1024]; 
     Socket senderSock; 

     public Form1() 
     { 
      InitializeComponent(); 

     } 



     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void btn_connect_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       // Create one SocketPermission for socket access restrictions 
        SocketPermission permission = new SocketPermission(
        NetworkAccess.Connect, // Connection permission 
        TransportType.Tcp,  // Defines transport types 
        "",      // Gets the IP addresses 
        SocketPermission.AllPorts // All ports 
        ); 

       // Ensures the code to have permission to access a Socket 
       permission.Demand(); 

       // Resolves a host name to an IPHostEntry instance    
       IPHostEntry ipHost = Dns.GetHostEntry(""); 

       // Gets first IP address associated with a localhost 
       IPAddress ipAddr = ipHost.AddressList[0]; 

       // Creates a network endpoint 
       IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 4510); 

       // Create one Socket object to setup Tcp connection 
       senderSock = new Socket(
        ipAddr.AddressFamily,// Specifies the addressing scheme 
        SocketType.Stream, // The type of socket 
        ProtocolType.Tcp  // Specifies the protocols 
        ); 

       senderSock.NoDelay = false; // Using the Nagle algorithm 

       // Establishes a connection to a remote host 
       senderSock.Connect(ipEndPoint); 



      } 
      catch (Exception exc) { MessageBox.Show(exc.ToString()); } 

     } 

     private void btnSend_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       // Sending message 
       //<Client Quit> is the sign for end of data 
       string theMessageToSend = text_IP.Text; 
       byte[] msg = Encoding.Unicode.GetBytes(theMessageToSend + "<Client Quit>"); 

       // Sends data to a connected Socket. 
       int bytesSend = senderSock.Send(msg); 


      } 
      catch (Exception exc) { MessageBox.Show(exc.ToString()); } 
     } 



    } 
} 

это коды в сервере (в C)

include "stdio.h" 
#include "stdlib.h" 
#include "sys/socket.h" 
#include "sys/types.h" 
#include "netinet/in.h" 
#include "error.h" 
#include "strings.h" 
#include "unistd.h" 
#include "arpa/inet.h" 

#define ERROR -1 
#define MAX_CLIENTS  
#define MAX_DATA 1024 


main(int argc, char **argv) 
{ 
    struct sockaddr_in server; 
    struct sockaddr_in client; 
    int sock; 
    int new,i; 
    int sockaddr_len = sizeof(struct sockaddr_in); 
    printf("sockaddr_len"); 
    int data_len; 
    char data[MAX_DATA]; 
    char temp[MAX_DATA]; 


    if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR) 
    { 
     perror("server socket: "); 
     exit(-1); 
    } 

    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(argv[1])); 
    server.sin_addr.s_addr = INADDR_ANY; 
    bzero(&server.sin_zero, 8); 

    if((bind(sock, (struct sockaddr *)&server, sockaddr_len)) == ERROR) 
    { 
     perror("bind : "); 
     exit(-1); 
    } 

    if((listen(sock, MAX_CLIENTS)) == ERROR) 
    { 
     perror("listen"); 
     exit(-1); 
    } 
    printf("\nThe TCPServer Waiting for client on port %d\n",ntohs(server.sin_port)); 
     fflush(stdout); 

    while(1) // Better signal handling required 
    { 
     if((new = accept(sock, (struct sockaddr *)&client, &sockaddr_len)) == ERROR) 
     { 
      perror("accept"); 
      exit(-1); 
     } 

     printf("New Client connected from port no %d and IP %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr)); 

     data_len = 1; 


     while(data_len) 
     { 
      data_len = recv(new, data, MAX_DATA, 0); 
      printf("\nRecieved mesg from client: %s", data); 

      for(i = 0; data[ i ]; i++) 
      { 
       /* if(data[i]=='a' || data[i]=='e' || data[i]=='i' ||data[i]=='o' || data[i]=='u') 
        data[ i ] = toupper(data[ i ]); 
       else */ 
       data[ i ] = data[ i ] ; 

      }  

      if(data_len) 
      { 

       send(new, data, data_len, 0); 
       data[data_len] = '\0'; 
       printf("\nSent mesg to client: %s", data); 
      } 

     } 

     printf("Client disconnected\n"); 

     close(new); 

    } 

    close(sock); 


} 
+0

Есть ли какой-то причине вы сомневаетесь * ваш * код сокета в C/C# будет работать правильно ударять ваш клиент/сервер в C#/C? Если да, то как мы можем узнать корень этого сомнения, не видя * кода *? – WhozCraig

+0

извините, я забыл приложить его. Я редактировал и прикреплял код клиента. для кода сервера, у меня действительно есть примерная программа, но она не работает с этими кодами клиентов. Клиентский код работает с кодами сервера на C# .NET. – thom17

+0

Не могли бы вы рассказать нам, каким образом это не работает? Можете ли вы подключиться к серверу? Вы получаете сообщение об ошибке/исключение? В клиентском коде вы вызываете GetHostEntry с пустым именем хоста. Вы использовали там имя хоста сервера во время тестирования? –

ответ

0

гнездо является универсальным понятием и не является специфической для любого языка. Вы можете использовать один и тот же код C Ubuntu Server и код клиента C# Windows.

несколько вещей, которые нужно заботиться о являются:

  • Как связать & клиент-сервер и используемый протокол.
  • Настройки брандмауэра.

Надеется, что вы можете начать удар с этими входами

Днем Coding :)

+0

Спасибо за ваши комментарии. Я пытаюсь переделать свои коды для сервера в Windows. Надеюсь, он скоро сработает: D – thom17

+0

Пробовал ли вы использовать код на стороне сервера C на окнах. попытайтесь запустить сервер и клиент в окнах. – srid99

0

Так я предполагаю, что ваши клиент могут по крайней мере говорить друг с другом. Но похоже, что проблема заключается в том, что вы отправляете свой текст в формате Unicode с C#, а затем получаете его как ASCII на стороне клиента. Если по умолчанию не используется ASCII для вашего клиента C.

+0

Я изменил свои коды уже с Unicode на ASCII, используя System.Text.Encoding.ASCII.GetBytes моей самой большой проблемой является то, что я не знаю, как создать правильные коды для сервера на C. У меня есть несколько примеров и пробовал чтобы изменить его, но все равно не работает. – thom17

+0

В конце концов, я не мог подключиться к серверу и отправить данные. в любом случае, спасибо за ваши комментарии :) – thom17

0

В вашем Кодексе клиентов вы вызываете GetHostEntry с пустым именем хоста. Это даст вам IP-адрес вашего Клиента.

Вы должны позвонить GetHostEntry с именем хоста сервера:

// Resolves a host name to an IPHostEntry instance    
IPHostEntry ipHost = Dns.GetHostEntry("Server.Host.Name"); 

// Gets first IP address associated with a localhost 
IPAddress ipAddr = ipHost.AddressList[0]; 

// Creates a network endpoint 
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 4510); 
Смежные вопросы