// mode: 0 call sendto
// 1 call sendmsg
// 2 call connect and send/sendmsg/write
void udp_test(int mode, const char* addr, unsigned short port, const char* text)
{
int s = socket(AF_INET,SOCK_DGRAM,0);
if (s<0)
{
printf("socket failed: %d\n",errno);
return;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = inet_addr(addr);
int len = strlen(text);
int ret = 0;
if (mode==0)
{
ret = sendto(s,text,len,0,(struct sockaddr*)&sin,sizeof(sin));
}
else if(mode==1)
{
struct msghdr msg;
struct iovec iov;
msg.msg_name = &sin;
msg.msg_namelen = sizeof(sin);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_iov->iov_base = (char*)text;
msg.msg_iov->iov_len = len;
msg.msg_control = 0;
msg.msg_controllen = 0;
msg.msg_flags = 0;
ret = sendmsg(s,&msg,0);
}
else if(mode==2)
{
if(connect(s,(struct sockaddr*)&sin,sizeof(sin))<0)
{
printf("socket failed: %d\n",errno);
return;
}
ret = send(s,text,len,0);
}
printf("send %d byte to %s:%hu\n",ret,addr,port);
close(s);
}
int main(int argc, const char **argv)
{
if(argc<5)
return -1;
int msgid = atoi(argv[1]);
udp_test(atoi(argv[1]),argv[2],atoi(argv[3]),argv[4]);
return 0;
}
为了重复发,可以写个脚本循环调用
#!/bin/bash
while [ 1 ]
do
./udp_test 0 192.168.0.100 8999 "this is my words"
sleep 1
done