?? udpcli.cpp
字號:
#include <winsock2.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <time.h>
#pragma comment(lib,"ws2_32")
#define BUFSIZE 8192
#define DEFAULT_PORT 5320
enum {CMD_NAME,DST_IP,DST_PORT};
void InitWinSocket();
void ParseCmdLine(int*port ,unsigned long *ip,int argc,char*argv[]);
void CreateUdpSocket(SOCKET* sock);
void CommunicateWithServer(SOCKET sock,int port,unsigned long IP);
void BindToIPAndPort(SOCKET listen_sock,int port,unsigned long IP);
void SetIpAndPort(struct sockaddr_in *addr,int port,unsigned long IP);
int main(int argc, char *argv[]){
int port;
SOCKET sock;
unsigned long dst_ip;
InitWinSocket();
ParseCmdLine(&port,&dst_ip,argc,argv);
CreateUdpSocket(&sock);
BindToIPAndPort(sock, 5325,INADDR_ANY);
CommunicateWithServer(sock,port,dst_ip);
closesocket(sock);
WSACleanup();
return 0;
}
void InitWinSocket(){
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
exit(EXIT_FAILURE);
}
}
void ParseCmdLine(int*port ,unsigned long *ip,int argc,char*argv[]){
if(argc != 2 && argc!=3){
fprintf(stderr," Usag: %s hostname [port]\n",argv[0]);
exit(EXIT_FAILURE);
}
if((*ip=inet_addr(argv[DST_IP]))==INADDR_NONE){
struct hostent* he;
if((he=gethostbyname(argv[DST_IP]))==NULL){
fprintf(stderr,"gethostbyname error\n");
exit(EXIT_FAILURE);
}
memcpy((char*)ip,(char*)he->h_addr,he->h_length);
}
*ip=ntohl(*ip);
if(argc==3){
if((*port=(atoi(argv[DST_PORT])))==0){
struct servent *se;
if((se=getservbyname(argv[DST_PORT],"UDP"))!=NULL)
*port=(int)ntohs((u_short)se->s_port);
else{
fprintf(stderr,"getservbynmame error\n");
exit(EXIT_FAILURE);
}
}
}else *port=DEFAULT_PORT;
}
void CreateUdpSocket(SOCKET* sock){
if((*sock=socket(AF_INET,SOCK_DGRAM,0))<0){
perror("socket");
exit(EXIT_FAILURE);
}
}
void SetIpAndPort(struct sockaddr_in *addr,int port,unsigned long IP){
memset((char*)addr,0,sizeof(addr));
addr->sin_family=AF_INET;
addr->sin_addr.s_addr=htonl(IP);
addr->sin_port=htons(port);
}
void BindToIPAndPort(SOCKET listen_sock,int port,unsigned long IP){
struct sockaddr_in localAddr;
SetIpAndPort(&localAddr,port,IP);
if(bind(listen_sock,
(struct sockaddr*)&localAddr,
sizeof(localAddr))<0){
perror("bind");
exit(EXIT_FAILURE);
}
}
void CommunicateWithServer(SOCKET sock,int port,unsigned long IP){
char buf[BUFSIZE],cmd[BUFSIZE],recv_buf[BUFSIZE];
int n,len=0;
struct sockaddr_in server;
struct sockaddr_in rnode;
SetIpAndPort(&server,port,IP);
printf("UDP>");
fflush(stdout);
len=sizeof(rnode);
while(gets(buf)!=NULL){
sscanf(buf,"%s",cmd);
if(strcmp(cmd,"quit")==0) break;
if(sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,
sizeof(server))<0) break;
if((n=recvfrom(sock,recv_buf,BUFSIZE-1,0,
(struct sockaddr*)&rnode,&len))<0){
fprintf(stderr,"recvfrom failed: %d\n",GetLastError());
break;
}
recv_buf[n]='\0';
printf("%s",recv_buf);
printf("UDP>");
fflush(stdout);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -