は、それは、Debian 5.0上で動作しますが、それは私が私がダンプ質問ですメッセージのトンを得ることはありませいただければ幸い
Ubuntuの11.10でセグメンテーションフォールトが発生します。私は本当にどこに問題があるのかを調べようとしましたが、なぜこれが1つのLinuxで動作し、他のLinuxでセグメンテーション違反が発生するのかわかりません。だから、コンピュータナンバーワンで動かすとうまくいきますが、私がそれを2番の漫画家で走らせると、セグメンテーションフォルトが起こり、メッセージSIGSEGVが出ます。
猫の/ etc /問題が得る:1の設定を持っている
コンピュータの数のDebian GNU/Linuxの5.0
のuname -aを取得します。Linuxのeryx2 2.6.34.4servgs#3 SMP日8月22日0時38分18秒CEST 2010年のi686 GNU/Linuxの
コンピュータの数2は設定があります。
猫の/ etc /問題が出ます:Ubuntuの11.10
は、uname -aを取得:LinuxのUbuntuの3.0.0-15-一般的な#25-UbuntuのSMP月1月2日17:44:42 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
私のアプリケーションのコードを囲みます。
1.Iは、サーバーで実行 - クライアントを実行して、[OK]
2.Iを
3.Clientは、サーバー
へのメッセージは、サーバからメッセージを受け取るしよう4.Server、それがセグメンテーションフォールト
しかし、この問題を引き起こす送信私は最初のコンピュータでそれを実行するときにUbuntu上でのみです私はそれがokを指定しました。
また、各システムでソースコードをコンパイルします。
サーバー:
#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に
のJava(1.6.0_20-B02を構築)ホットスポット(TM)サーバーのVM(16.3-B01、混合モードを構築する)
gccのバージョン4.3.2(Debianの4.3.2-1.1)
第二のコンピュータのUbuntu
Javaのバージョン "1.6.0_26"
のJava(TM)SEランタイム環境(1.6.0_26-B03を構築)
は、Java HotSpot(TM)64ビットサーバーVM(20.1-B02を構築し、混合モード)
gccバージョン4.6.1(Ubuntu/Linaro 4.6。1-9ubuntu3)
編集:問題trought dicusionを解決し、私はそれが同様の問題で誰かを助けるかもしれない変更を追加している
をグーグル。 のprintf(「%から接続されたクライアント: 代わり
int server_len, client_len;
の私は(セグメンテーションフォールトの原因があった)こののではなく、その後socklen_t str_len, client_len;
を使用する必要があります。サーバーでの夫婦の問題があり
ましたs \ n "、inet_ntoa(client_address.sin_addr)); 関数inet_ntopを使用する必要があります。理由は、inet_ntoaが廃止されたことがわかりました。 segフォールトの原因は%sを使用しているためprintfのargが期待されているためです。char * これがより良い解決策であり、私も明らかにしたいと思います。
char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET,&(client_address.sin_addr), str, INET_ADDRSTRLEN);
printf("Connected client from %s\n", str);
私はtrouhtコメントや私の仕事の良い答えを得る原因私は、どのようなこの質問を知りませんでした。 問題を解決するために必要な修正を少なくとも追加しました。
両方のマシンでJavaとgccのバージョンは何ですか? – Makoto
'-Wall'を指摘して、Cコードをコンパイルするすべての問題を解決してください。 – Mat
segフォルトが発生する場所を教えてください。デバッガでコアダンプをロードするとどうなるでしょうか? –