recv
这里直接使用的是阻塞式。
接受到一个udp包后,回复一个udp包。
回复地址通过recvfrom获取。
通过bind绑定接受端端口9999。
void recv_test()
{
int32_t nSockHandle;
nSockHandle = socket(AF_INET, SOCK_DGRAM, 0);
printf("nSockHandle: %d\n", nSockHandle);
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
local_addr.sin_port = htons(9999);
bind(nSockHandle, (struct sockaddr*)&local_addr, sizeof(local_addr));
while(true){
static char recv_buf[1024];
struct sockaddr_in net_addr;
int net_addr_len = sizeof(net_addr);
int rsize = recvfrom(nSockHandle, recv_buf, 1024, 0, (struct sockaddr*)&net_addr, &net_addr_len);
printf("rsize: %d\n", rsize);
printf("net_addr sin_family: %d\n", ntohs(net_addr.sin_family));
printf("net_addr s_addr: %d\n", ntohs(net_addr.sin_addr.s_addr));
printf("net_addr port: %d\n", ntohs(net_addr.sin_port));
printf("%s\n", recv_buf);
char send_buf[1024];
sprintf(send_buf, "%s\n", "success");
printf("strlen(cb): %d\n", strlen(send_buf));
int ssize = 0;
printf("wait 5\n");
sleep(5);
ssize = sendto(nSockHandle, send_buf, strlen(send_buf)+1, 0, (struct sockaddr*)&net_addr, sizeof(net_addr));
printf("send size: %d errno: %d\n", ssize, errno);
sleep(1);
printf("wait\n");
}
}
send
void send_test()
{
int32_t nSockHandle;
nSockHandle = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in net_addr;
memset(&net_addr, 0, sizeof(net_addr));
net_addr.sin_family = AF_INET;
net_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
net_addr.sin_port = htons(9999);
char send_buf[1024];
sprintf(send_buf, "%s\n", "hello");
int ssize = sendto(nSockHandle, send_buf, strlen(send_buf)+1, 0, (struct sockaddr*)&net_addr, sizeof(net_addr));
printf("send size: %d\n", ssize);
char recv_buf[1024];
int net_addr_len = sizeof(net_addr);
int rsize = 0;
while(true){
rsize = recvfrom(nSockHandle, recv_buf, 1024, 0, (struct sockaddr*)&net_addr, &net_addr_len);
if(rsize <= 0){
printf("wait\n");
sleep(1);
continue;
}
printf("rsize: %d errno %d\n", rsize, errno);
if(rsize > 0)
printf("%s\n", recv_buf);
}
}
非阻塞可以通过fcntl设置。