我是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;
}
由于程序已经编译,因此头文件部分绝对没有问题,所以我忽略了包含该部分。