服务器端: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();
}