Он работает в Debian 5.0, но вызывает ошибку сегментации в Ubuntu 11.10 - PullRequest
0 голосов
/ 22 января 2012

1001 *
*

Надеюсь, я не получу тонны сообщений, которые задают дамп. Я действительно пытался выяснить, где проблема, но я не знаю, почему это работает на одном linux и вызывает ошибку сегментации на другом linux. Поэтому, когда я запускаю его на компьютере номер один, он работает нормально, но когда я запускаю его на компьютере № 2, это вызывает ошибку сегментации, и я получаю сообщение SIGSEGV.

Компьютер номер один имеет конфигурацию:
cat / etc / issue get: Debian GNU / Linux 5.0
uname -a get: Linux eryx2 2.6.34.4servgs # 3 SMP Sun 22 августа 00:38:18 CEST 2010 i686 GNU / Linux
Компьютер номер два имеет конфигурацию:
cat / etc / issue get: Ubuntu 11.10
uname -a get: Linux Ubuntu 3.0.0-15-generic # 25-Ubuntu SMP Пн 2 января 17:44:42 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

Я прилагаю код своей заявки.
1. Я запускаю сервер - хорошо
2. Я запускаю клиент
3.Клиент отправляет сообщение на сервер
4.Сервер пытается получить сообщение от сервера, и это вызывает ошибку сегментации.

Но эта проблема возникает только в Ubuntu, когда я запускаю его на первом компьютере, который, как я указал, работает нормально.

Я также строю соотв. Скомпилируйте исходные коды в каждой системе.

Сервер:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

int sendMessage(char* msg, int socket){
    int length = strlen(msg);
    int ret;

    ret = write(socket, msg, length);
    return ret;
}

int readLine(void *vptr, size_t maxlen, int sockd) {
    int n, rc;
    char    c, *buffer;

    buffer = vptr;

    for ( n = 1; n < maxlen; n++ ) {

        if ( (rc = read(sockd, &c, 1)) == 1 ) {
            *buffer++ = c;
            if ( c == '\n' )
                break;
        }
        else if ( rc == 0 ) {
            if ( n == 1 )
                return 0;
            else
                break;
        }

    }

    *buffer = 0;
    return n;
}

int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;


    server_sockfd = socket( AF_INET, SOCK_STREAM, 0 );
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    server_address.sin_port = htons( 10000 );

    server_len = sizeof( server_address );

        if( bind( server_sockfd, ( struct sockaddr *)&server_address, server_len ) != 0 )
        {
                perror("oops: server-tcp-single");
                exit( 1 );
        }

    listen( server_sockfd, 5 );

    signal( SIGCHLD, SIG_IGN );

    while( 1 )
    {
        char ch;

        printf( "server wait...\n" );

        client_len = sizeof( client_address );
        client_sockfd = accept( server_sockfd, ( struct sockaddr *)&client_address, &client_len );

        printf( "Connected client from %s\n", inet_ntoa( client_address.sin_addr) );

        if( fork() == 0 )
        {
            char retezec[20];
            readLine(retezec, 20, client_sockfd);

            printf( "Klient sent : %s\n", retezec );
            printf( "Server sends : %s\n", retezec );
            sendMessage(retezec, client_sockfd);
                close( client_sockfd );

            exit (0 );
        }
        else
            close( client_sockfd );

    }
}

клиент

import java.io.*;
import java.net.*;

class clientTCP
{
    private static PrintWriter pw;
    private static BufferedReader br;

    private static void sendToServer(String msg) {
          try 
      {
                pw.println(msg);
                //System.out.println(msg);
                System.out.println("Klient poslal: " + msg);
            } 
      catch (Exception e)
      {
            // System.out.println("e.Message");
          }
    }

    private static String recieveFromServer() {
        String msg = "Chyba";
        try
      {
                msg = br.readLine();
              //System.out.println(msg);
              System.out.println("Klient prijal: " + msg);
        }
      catch (Exception e)
      {
                System.out.println("Selhalo prijimani zpravy zpravy!");
                //System.out.println(e.Message);
       }
       return msg;
    }

 public static void main(String argv[]) throws Exception
 {
  Socket socket = new Socket("127.0.0.1", 10000);
  InetAddress adresa = socket.getInetAddress();
  System.out.print("Pripojuju se na : "+adresa.getHostAddress()+" se jmenem : "+adresa.getHostName()+"\n" );

  pw = new PrintWriter(socket.getOutputStream(), true);
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  sendToServer("ahoj\n");
  String message = recieveFromServer(); 
  //System.out.println("Message Received: " + message);
  socket.close();
 }
}

Спасибо.

Отредактированные версии java и gcc:

первый компьютер Debian:
Java-версия "1.6.0_20"
Java (TM) SE Runtime Environment (сборка 1.6.0_20-b02)
Серверная виртуальная машина Java HotSpot ™ (сборка 16.3-b01, смешанный режим)

gcc версия 4.3.2 (Debian 4.3.2-1.1)

второй компьютер Ubuntu
Java-версия "1.6.0_26"
Java (TM) SE Runtime Environment (сборка 1.6.0_26-b03)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 20.1-b02, смешанный режим)

gcc версия 4.6.1 (Ubuntu / Linaro 4.6.1-9ubuntu3)

Редактировать: проблема решена путаница и поиск в Google
поэтому я добавляю изменения, это может помочь кому-то с подобной проблемой.
Было несколько проблем с сервером: вместо

int server_len, client_len;

Я должен использовать socklen_t str_len, client_len;
Тогда вместо этого (что стало причиной ошибки сегментации): printf («Подключенный клиент из% s \ n», inet_ntoa (client_address.sin_addr)); Я должен использовать функцию inet_ntop, потому что я обнаружил, что inet_ntoa устарела. Причиной ошибки seg было то, что я использую% s, так как аргумент printf ожидается char * это лучшее решение, и я надеюсь, также ясно.

char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET,&(client_address.sin_addr), str, INET_ADDRSTRLEN);
printf( "Connected client from %s\n", str );

Я не знал, что с этим вопросом, потому что я получаю хорошие ответы, комментарии и мою работу. Поэтому я, по крайней мере, добавил исправления, необходимые для решения проблемы.

Ответы [ 2 ]

1 голос
/ 22 января 2012

Я бы удостоверился, что вы всегда устанавливаете \0 в конце. У вас есть return 0, который звонящий игнорирует. Это означает, что если у char [] нет байта \0 в массиве, вы можете получить ошибку сегмента.

0 голосов
/ 09 августа 2012

я встречаю ту же проблему.это потому, что вы не можете включить

#include <arpa/inet.h>

, что приводит к неявному объявлению при компиляции кода.метод неявного объявления всегда возвращает int intread других типов (например, char *).

ошибка сегмента, когда

printf ("Подключенный клиент из% s \ n", inet_ntoa (client_address.sin_addr));

, потому что inet_ntoa () возвращает адрес и была преобразована в 0xffffffffef7dde20, который находится за пределами.возвращаемое значение inet_ntoa было обработано как 32-битное целое число.

вы решаете свою проблему с помощью inet_ntop, а не потому, что решение inet_ntop является решением; если вы используете возвращаемое значение inet_ntop в качестве аргумента printf, вы все равно получаетеошибка сегмента.

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