我使用此代码从我的Java客户端向我的Java服务器发送一个整数
int n = rand.nextInt(50) + 1;
DataOutputStream dos = new DataOutputStream(_socket.getOutputStream());
dos.writeInt(n);
我使用此代码在服务器中阅读
DataInputStream din = new DataInputStream(socket.getInputStream());
int ClientNumber= din.readInt();
System.out.println(ClientNumber);
ClientNumber++;
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(ClientNumber);
String randomString= getRandomValue(10,20);
dos.writeUTF(randomString);
它工作得很好,但现在我想写一个C客户端 我试过这段代码
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVEURNAME "localhost" // adresse IP de mon serveur
int to_server_socket = -1;
void main ( void )
{
char *server_name = SERVEURNAME;
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
long hostAddr;
long status;
char buffer[512];
bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ( (long)hostAddr != (long)-1)
bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else
{
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL)
{
printf("gethost rate\n");
exit(0);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(8071);
serverSockAddr.sin_family = AF_INET;
/* creation de la socket */
if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("creation socket client ratee\n");
exit(0);
}
/* requete de connexion */
if(connect( to_server_socket,
(struct sockaddr *)&serverSockAddr,
sizeof(serverSockAddr)) < 0 )
{
printf("demande de connection ratee\n");
exit(0);
}
/* envoie de donne et reception */
int value = htons( 4 );
write( to_server_socket, &value, sizeof( value ) );
printf(buffer);
}
但它不起作用。我使用Eclipse来编译java代码并为C代码(客户端)运行服务器和xcode,但我不认为问题存在
编辑: 我在服务器上出错了
java.net.SocketException:管道损坏了 java.net.SocketOutputStream.socketWrite0(Native Method)at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 在java.net.SocketOutputStream.write(SocketOutputStream.java:115)at java.io.DataOutputStream.writeInt(DataOutputStream.java:182)at at ServiceRequest.run(ServiceRequest.java:36)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)
我认为这是因为我服务器等待一个整数,但它不是......?
答案 0 :(得分:2)
在这个陈述中,有两件事突然出现在我身上......
write(to_server_socket,"4",4);
1)“4”不是一个整数,它是一个空终止的字符串(好吧,好吧,它是一个整数,但它并不是你所说的“意思”让我想到的)
2)您正在以host-byte-order发送值,该值可能与network-byte-order相同或不同
int value = htons( 4 );
write( to_server_socket, &value, sizeof( value ) );
然而,除此之外,来自java socketWrite()
的“破坏管道”错误往往表明您的发送方(C应用程序)已关闭套接字并且您的Java端仍在尝试写入它
您的C客户端代码正在打开套接字,写入它然后立即打印一个您从未填充任何内容并退出程序的缓冲区。程序退出后,您为其创建的套接字将关闭,因此Java服务器中出现“已损坏的管道”错误。您需要阅读服务器的回复...
int value = htonl( 4 );
int reply = 0;
if( send( to_server_socket, &value, sizeof( value ), 0 ) != sizeof( value ) )
{
printf( "socket write failed: %s", strerror( errno ) );
exit( -1 );
}
if( recv( to_server_socket, &reply, sizeof( reply ), MSG_WAITALL ) != sizeof( reply ) )
{
printf( "socket read failed: %s", streror( errno ) );
exit( -1 )
}
printf( "got reply: %d\n", ntohl( reply ) );
在单独的注释中......您表示您在服务器上收到262144 ...是在我建议的更改之前还是之后? 262144是0x00040000 - 所以...你确实得到了4,而不是你预期收到它的地方。所以,你使用32位整数(我应该意识到这一点),这意味着你要使用htonl()
和ntohl()
而不是htons()
和ntohs()
整数转换。