Я новичок в языке 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;
}
Поскольку программа была скомпилирована, часть заголовочного файла определенно не проблема, поэтому я игнорирую включение этой части.