linux下使用udpsocket时遇到的问题
关于数据报socket的使用,很多博客都有,由于事先已知客户端的ip字串,不想服务端使用通过recvfrom时保存下来的struct sockaddr_in*类型ip,想通过之前ip字串来让服务器给客户端发送数据,发现出现了问题,仔细研究后发现是发送数据给客户端时,使用了之前的服务器绑定的端口,这是不对的,客户端的端口是系统随机分配的,必须要使用之前获取客户端地址时的端口,因此必须保存该端口,其次也可以固定一个客户端端口,这样客户端需要初始化ip,同时绑定ip和端口。
具体代码如下:
客户端:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define SERVER_PORT 8000
#define CLIENT_PORT 8001
int main()
{
int sock_fd;
int send_num;
int recv_num;
int dest_len;
char send_buf[1024] = "hello server";
char recv_buf[1024];
struct sockaddr_in addr_serv;
struct sockaddr_in addr_client;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0)
{
printf("create socket failedn");
return -1;
}
//初始化本机地址
memset(&addr_client, 0, sizeof(addr_client));
addr_client.sin_family = AF_INET;
addr_client.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要进行网络序转换,INADDR_ANY:本地地址
addr_client.sin_port = htons(CLIENT_PORT);
if (bind(sock_fd, (struct sockaddr*)&addr_client, sizeof(addr_client)) < 0)
{
printf("client bind failedn");
return -1;
}
printf("client bind sucessfuln");
//初始化服务端地址
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr("192.168.16.130");
addr_serv.sin_port = htons(SERVER_PORT);
dest_len = sizeof(struct sockaddr_in);
printf("begin send:n");
send_num = sendto(sock_fd, send_buf, sizeof(send_buf), 0, (struct sockaddr*)&addr_serv, dest_len);
if (send_num < 0)
{
printf("send to message fialedn");
return -1;
}
else
{
printf("send sucessful:%sn",send_buf);
}
printf("send_num:%dn", send_num);
printf("client sock_id:%dn", sock_fd);
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&addr_serv, &dest_len);
printf("recvbuf:%sn", recv_buf);
if (recv_num < 0)
{
perror("recv_from");
}
else
{
printf("recv sucessfuln");
}
recv_buf[recv_num]='