繁体   English   中英

在套接字编程中,我在服务器端接收到用c编写代码的字符串时遇到错误

[英]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可以理解的方式写出字符:

  • 它使用UTF-8的修改版
  • 它预装了琴弦的长度

可以用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM