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 );
Я не знал, что с этим вопросом, потому что я получаю хорошие ответы, комментарии и мою работу.
Поэтому я, по крайней мере, добавил исправления, необходимые для решения проблемы.