简单UDP程序

 

服务器端:UdpSev.cpp

/*-------udp server-----*/

#include <windows.h>
#include <winsock.h>
#include <stdio.h>

#define IP8TO32(ip1, ip2, ip3, ip4) ((0xff & ip1) | (0xff00 & (ip2 << 8)) | (0xff0000 & (ip3 << 16)) | (0xff000000 & (ip4 << 24)))

unsigned int ipstonl(char* ips)
{
if(ips == NULL || strlen(ips) < 10 || strlen(ips) > 16)
{
   printf("ip format error!");
   return -1;
}

//get dot ip
unsigned int ipi[5] = {0};
char *ps, *pi;
ps = pi = ips;
int i = 0;
while(*pi++ != '/0')
{
   if((*pi == '.') || i == 3)
   {
    atoi(pi);
    ipi[i] = atoi(ps);
    if(ipi[i] <= 0 || ipi[i] > 255)
    {
     printf("ip format error!");
     //exit(1);
     return -1;
    }
   
    ps = pi + 1;
    i++;
   }

   if(i > 4)
   {
    printf("ip format error!");
    return -1;
   }
}

//tranfer
ipi[4] = IP8TO32(ipi[0], ipi[1], ipi[2], ipi[3]);
printf("tranfer ip = %d/n", ipi[4]);

return ipi[4];
}

int ipnltos(int ipl, char* ips, int len)
{
if(ipl < 0 || ips == NULL || len < 16)
{
   printf("ip error!/n");
   return -1;
}

sprintf(ips, "%d.%d.%d.%d", 0xff & ipl, 0xff & (ipl >> 8), 0xff & (ipl >> 16), 0xff & (ipl >> 24));

return 0;
}

int main()
{
//param set: ip and port
unsigned int sevAddr;
unsigned short port = 2346;
sevAddr = ipstonl("192.168.1.103");

int i = 0;   //test connect number
bool bSend = false;

//socket
int status;
WSADATA wData;
status = WSAStartup(MAKEWORD(1, 1), &wData);
if(status != 0)
{
   perror("WSAStartup() error!");
   return -1;
}

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
if(s == INVALID_SOCKET)
{
   perror("socket() error!");
   goto CLEAN;
}

SOCKADDR_IN sevSockAddr;
memset(&sevSockAddr, 0, sizeof(SOCKADDR_IN));
sevSockAddr.sin_family     = AF_INET;
sevSockAddr.sin_port     = htons(port);
sevSockAddr.sin_addr.S_un.S_addr = sevAddr;//htonl(INADDR_ANY);
status = bind(s, (LPSOCKADDR)&sevSockAddr, sizeof(SOCKADDR_IN));
if(status != 0)
{
   perror("bind() error!/n");
   closesocket(s);
   goto CLEAN;
}

while(1)
{
   SOCKADDR_IN addr;
   int len = sizeof(SOCKADDR_IN);
   memset(&addr, 0, len);
   addr.sin_family = AF_INET;
   char buf[200] = {0};
   status = recvfrom(s, buf, sizeof(buf), 0, (LPSOCKADDR)&addr, &len);
   if(status < 0)
   {
    perror("recvfrom() error!");
    printf("error no = %d/n", WSAGetLastError());
    closesocket(s);
    goto CLEAN;
   }
   /*//-----对于udp包的连接终止判断在应用层协议中
   else if(status == 0)
   {
    printf("recvfrom() data end!/n");
    break;
   }
   */
   else if(strcmp(buf, "acqz") == 0)
   {
    //---udp connect packet to respond
    sendto(s, "cyes", strlen("cyes") + 1, 0, (LPSOCKADDR)&addr, len); //sendto会造成recv失败。。。。需处理
    bSend = true;
   }
  
   if(bSend)
   {
    //send datas
    sendto(s, "123", 4, 0, (LPSOCKADDR)&addr, len);
    sendto(s, "123", 4, 0, (LPSOCKADDR)&addr, len);
    sendto(s, "123", 4, 0, (LPSOCKADDR)&addr, len);
    sendto(s, "123", 4, 0, (LPSOCKADDR)&addr, len);

    i++;
    unsigned long ip_ = addr.sin_addr.S_un.S_addr;
    char ips[16] = {0};
    ipnltos(ip_, ips, sizeof(ips));
    printf("recvfrom(): client_ip = /"%s/", client_port = /'%d/', buflen = /'%d/', buf = /"%s/"/n", ips, ntohs(addr.sin_port), status, buf);
   }

   Sleep(1000);
   printf("******test......%d/n", i);
}

closesocket(s);
printf("udp server close!/n");

CLEAN:
WSACleanup();
return 0;
}

 

客户端:UdpClt.cpp

#include <windows.h>
#include <winsock.h>
#include <stdio.h>

void main()
{
int status;
WSADATA wData;
status = WSAStartup(MAKEWORD(1, 1), &wData);
if(status != 0)
{
   perror("WSAStartup() error!");
   return;
}

SOCKADDR_IN sevAddrIn;
sevAddrIn.sin_addr.S_un.S_addr = 0x6701A8C0;
sevAddrIn.sin_port     = htons(2345);
sevAddrIn.sin_family    = AF_INET;

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
if(s == INVALID_SOCKET)
{
   perror("socket() error!");
   return;
}

status = sendto(s, "12345ttt", 9, 0, (LPSOCKADDR)&sevAddrIn, sizeof(SOCKADDR_IN));
if(status != 9)
{
   //perror("sendto() error!");
   printf("sendto() error, errno = %d/n", WSAGetLastError());
   return;// WSAGetLastError();
}
else
{
   unsigned long ip_ = sevAddrIn.sin_addr.S_un.S_addr;
   char ips[16] = {0};
//   ipnltos(ip_, ips, sizeof(ips));
   printf("sendto() ok: sever_ip = /"%s/", server_port = /'%d/', data = /"%s/"/n", ips, ntohs(sevAddrIn.sin_port), "12345ttt");
}

///
///
SOCKADDR_IN sevAddrIn2;
sevAddrIn2.sin_addr.S_un.S_addr = 0x6701A8C0;
sevAddrIn2.sin_port     = htons(5555);
sevAddrIn2.sin_family    = AF_INET;
status = sendto(s, "12345ttt", 9, 0, (LPSOCKADDR)&sevAddrIn2, sizeof(SOCKADDR_IN));
if(status != 9)
{
   //perror("sendto() error!");
   printf("sendto() error, errno = %d/n", WSAGetLastError());
   return;// WSAGetLastError();
}

status = sendto(s, "12345ttt", 9, 0, (LPSOCKADDR)&sevAddrIn, sizeof(SOCKADDR_IN));
status = sendto(s, "12345ttt", 9, 0, (LPSOCKADDR)&sevAddrIn2, sizeof(SOCKADDR_IN));
closesocket(s);
WSACleanup();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值