[英]In socket programming I am getting error on receiving string on the server side which has code written in c
这是我的C服务器代码。 我正在使用套接字连接将字符串从java发送到c。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 6865
#define BUF 2048
int main(int argc, char *argv[])
{
struct sockaddr_in host, remote;
int host_fd, remote_fd;
int size = sizeof(struct sockaddr);;
char *data[BUF];
host.sin_family = AF_INET;
host.sin_addr.s_addr = htonl(INADDR_ANY);
host.sin_port = htons(PORT);
memset(&host.sin_zero, 0, sizeof(host.sin_zero));
host_fd = socket(AF_INET, SOCK_STREAM, 0);
if(host_fd == -1)
{
printf("socket error %d\n", host_fd);
return 1;
}
if(bind(host_fd, (struct sockaddr *)&host, size))
{
printf("bind error\n");
return 1;
}
if(listen(host_fd, 5))
{
printf("listen error");
return 1;
}
printf("Server setup, waiting for connection...\n");
remote_fd = accept(host_fd, (struct sockaddr *)&remote, &size);
printf("connection made\n");
int read = recv(remote_fd,&data,BUF, 0);
// data[read]='\0';
printf("read = %d, data = %s\n", read, data);
shutdown(remote_fd, SHUT_RDWR);
close(remote_fd);
return 0;
}
这是我向服务器发送字符串的Java代码。
package com.java.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientFirst
{
public static void main(String[] argv)
{
DataOutputStream os = null;
try
{
Socket socket = new Socket("10.9.79.80", 6865);
os = new DataOutputStream(socket.getOutputStream());
//String ch="shanx";
os.writeUTF("harsh");
/*char ch;
in=new DataInputStream(socket.getInputStream());
System.out.println(""+in.readChar());*/
os.close();
socket.close();
} catch (UnknownHostException e) {
System.out.println("Unkonw exception " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException caught " + e.getMessage());
}
}
}
C代码仅显示2,3个字符和一些垃圾数据,例如字符串中未知的符号。 请在这件事上给予我帮助
DataOutputStream.writeUTF
不仅以C可以理解的方式写出字符:
您可以用C编写代码来处理该问题,但是您需要非常明确地这样做。 (您可能发现其他人已经这样做了。)
或者,您可以使用OutputStreamWriter
并以所需的任何常规编码写出数据,可能使用其他方案来指定字符串的长度。 不过,您需要首先确定自己的要求-是否需要处理非ASCII文本? 您要通过同一套接字发送多个字符串吗?
还要注意,在C端,您应该在读取数据之后执行适当的0终止,以便将其作为普通的“ C字符串”进行处理。
我想问题出在您的C代码中-您需要声明char data[BUF]
(在您的示例中,您声明一个2048 char*
的数组)。 那应该工作。
int read = recv(remote_fd,&data,BUF, 0);
而不是使用“&data”,您应该使用(void *)&data。 而且您还应该将char *data[BUFF]
更改为char data[BUFF]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.