C语言中的recv函数无法获取值

时间:2019-03-14 13:33:38

标签: c sockets udp connect recv

我是C语言的新手,当我使用c编写套接字程序时,遇到了问题。    我想在两台计算机(Linux和Simulink)之间实现双向通信。在Linux中,我需要实现基于连接的UDP客户端和服务器。出于其他需求,我将创建UDP通信的过程分为四个部分:创建发送方套接字,服务器绑定过程,发送数据和接受数据。    代码已成功编译。在运行期间,该值可以成功发送到Simulink,但是在'recv()'函数中被阻止。我使用Wireshark查看Simulink所在计算机的数据包。这台计算机的数据包是正常的。换句话说,Linux中的套接字收到了数据报,但是我的程序无法读取它。    Linux中的代码如下:

void check_comm_error(int ret);// just for check error
void sendsock_creat();  //creat socket and server ip address
void sendsock_send(void* send_buf); //call send function and send data
void recvsock_creat(); called by sendsock_creat function
void recvsock_recv(); just for receieve data 
int client_fd; //定义套接字描述符
double senddata[1] = {10};
double recvdata[1];
struct sockaddr_in local_addr;//定义本地地址  <netinet/in.h>

void sendsock_creat()
{
    int check_ret = 0;//定义操作返回值,以传给check_comm_error函数
    struct sockaddr_in server_addr;//定义服务器地址  <netinet/in.h>
    int ser_addr_len;//定义服务端地址长度
    client_fd = socket(AF_INET, SOCK_DGRAM, 0); //创建客户端套接字

    check_ret = client_fd;
    check_comm_error(check_ret);//判断是否出错

    recvsock_creat();//Need to run the bind function before connect function 

    memset(&server_addr, 0, sizeof(server_addr)); //清空服务器地址结构体
    server_addr.sin_family = AF_INET; //定义地址中的地址类型
    server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);//给出服务端的ip地址 
    server_addr.sin_port = htons(SERVER_PORT);  //

    check_ret=connect(client_fd, (struct sockaddr*)&server_addr, 
    sizeof(server_addr)); //连接服务端
    check_comm_error(check_ret);//判断是否出错
}
void sendsock_send(void* send_buf)
{
    //void* send_buf 为待发送的数据缓冲区
    int check_ret = 0;
    check_ret = send(client_fd, send_buf, sizeof(send_buf), 0);
    check_comm_error(check_ret);
}
void check_comm_error(int ret)
{
    if(ret < 0)
    {
    perror("create socket fail!\n");
    exit(1);
    }
}
void recvsock_creat()
{
    int check_ret = 0;//定义操作返回值,以传给check_comm_error函数
    int recv_flag; //接受标志
    int ser_addr_len;//定义本地地址长度

    memset(&local_addr, 0, sizeof(struct sockaddr_in)); 
    local_addr.sin_family=AF_INET;//bind to a local port
    local_addr.sin_addr.s_addr=htonl(INADDR_ANY);       
    local_addr.sin_port=htons(LOCAL_PORT);
    check_ret = bind(client_fd,(struct sockaddr *)&local_addr, sizeof(struct 
    sockaddr_in));
    check_comm_error(check_ret);
    recv(client_fd, recvdata, sizeof(recvdata), 0);  //This function can get 
                                                       the right value
    printf("recv from simulink %f \n", recvdata[0]);
}
void recvsock_recv()
{
    int recv_flag;
    int addr_len;
    recv_flag = recv(client_fd, recvdata, sizeof(recvdata),0);
}
int main()
{
    sendsock_creat();
    sendsock_send((double *)senddata);
    recvsock_recv();      
    printf("recv from matlab %f .\n",recvdata[0]);
    return 0;
}

由于程序已经编译,因此头文件部分绝对没有问题,所以我忽略了包含该部分。

0 个答案:

没有答案