从java发送int到c
问题描述:
我试图从java服务器发送5个int到c客户端。从java发送int到c
这里是我的Java代码:
class Server {
public static void main(String args[]) throws Exception {
ServerSocket welcomeSocket = new ServerSocket(8080);
while(true)
{
Socket connectionSocket = welcomeSocket.accept();
System.out.println("welcomeSocket.accept() called");
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
outToClient.writeInt(1);
outToClient.writeInt(2);
outToClient.writeInt(3);
outToClient.writeInt(4);
outToClient.writeInt(5);
outToClient.close();
connectionSocket.close();
}
}
}
这里是我的C代码:
// the function below is made by made, it creates and return a socket
// AF_INET witch a tcp protocol
int sock = socketClient("localhost",8080);
if (sock < 0) {
printf("client : erreur socketClient\n");
exit(2);
}
char intBufferCoupReq[20];
int data = recv(sock, intBufferCoupReq, 80, 0);
printf("data recieved : %d\n",data);
if(data == -1){
printf("Error while receiving Integer\n");
}
char intBufferCoupReq2[5][4];
int cpt;
int j;
int i = j = 0;
// in this loop I divide my big array of 5 ints into 5 differents
// array to use with ntohl
for(cpt = 0; cpt < 20 ; cpt++){
if(cpt%5==0) i=0;
if(j%4==0) j=0;
intBufferCoupReq2[i][j] = intBufferCoupReq[cpt];
i++;
j++;
}
int receivedInt[5];
for(cpt=0;cpt<5;cpt++){
printf("int n°%d = %d\n",cpt+1,ntohl(*((int *) &intBufferCoupReq2[cpt])));
}
close(sock);
第一次C客户机发出请求它是有点儿罚款:
data recieved : 20
int n°1 = 4
int n°2 = 3
int n°3 = 2
int n°4 = 1
int n°5 = 5
但第二次(没有关闭服务器)我得到这个:
data recieved : 8
int n°1 = 16384
int n°2 = -1610612736
int n°3 = 11010050
int n°4 = -1342118655
int n°5 = 524519
而我的java服务器崩溃与“连接重置”错误。 这两个程序运行在同一台计算机上的本地主机,端口8080.
我一直在试图弄清楚这几天,但我真的无能为力。 你们有没有得到一个建议?
非常感谢!
答
在你的C程序,请更换:
char intBufferCoupReq[20];
int data = recv(sock, intBufferCoupReq, 80, 0);
printf("data recieved : %d\n",data);
if(data == -1){
printf("Error while receiving Integer\n");
}
有了:
char intBufferCoupReq[1024];
memset(intBufferCoupReq, '\0', sizeof(intBufferCoupReq));
int k = 0;
while (1) {
int nbytes = recv(sockfd, &intBufferCoupReq[k], 1, 0);
if (nbytes == -1) { printf("recv error\n"); break; }
if (nbytes == 0) { printf("recv done\n"); break; }
k++;
}
这样做是为了确保服务器发送的所有数据包都正确接收。
更新:添加代码以确认下面收到的数据。 Java程序以网络字节顺序发送整数,这需要转换为主机字节顺序。
int *myints = (int*) intBufferCoupReq;
int i = 0;
for (i=0; i<(k/4); i++) {
printf("myints[%d]=%d\n", i, ntohl(myints[i]));
}
它的工作非常感谢。 帮了我很多。 我只有几个问题: 您将数组“intBufferCoupReq”大小设置为1024位。 它是大的方式不是吗? 是否确保数组足够长? 为什么我按顺序收到整数? (4 3 2 1 5)当我的服务器发送它的顺序(1 2 3 4 5)? 再次感谢! – Sherokan
是的,最好有大的缓冲区。 1024字节(不是位)不是太大。这是为了防止服务器发生错误并发送超过缓冲区大小的预防措施。在TCP中,收到的订单必须与发送的订单相同。请再检查一次。 – tivn
请参阅我的编辑,其中包含额外的代码以确认收到的数据。 – tivn