Подключение клиента сокета C к серверу сокета C # - PullRequest
0 голосов
/ 15 сентября 2011

Я новичок в языках 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 Ответ

1 голос
/ 15 сентября 2011

Язык не имеет значения .Честный:)

Если вы используете их с двух разных компьютеров, первым делом проверьте ваш брандмауэр.

ПРЕДЛОЖЕНИЯ:

  1. Получитьсценарий, в котором конкретный клиент (например, ваш клиент C) может подключиться к определенному серверу (например, вашему серверу C).

  2. Скопируйте такие же .exe вПК, на котором возникают проблемы, и повторите попытку.

  3. Убедитесь, что разные .exe-файлы используют одинаковый порт #.

  4. Возможно, вас также заинтересует получение Wireshark, чтобы вы могли отслеживать пакеты, идущие туда-сюда (в частности, пакет TCP «SYN», который выдает клиент при попытке подключения):

    http://www.wireshark.org

'Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...