天天看點

unix網絡程式設計之udp

   #include <iostream>

   #include <arpa/inet.h>

   #include <sys/socket.h>

   using namespace std;

   int main(int argc, char* argv[])

   {

short port = 12345;

if(argc > 1)

  port = atoi(argv[1]);

int ss = socket(AF_INET,SOCK_DGRAM, 0);

if(ss < 0)

{

    cout<<"socket error"<<endl;

    return -1;

}

sockaddr_in si;

socklen_t len = sizeof(si);

si.sin_family = AF_INET;

si.sin_port = htons(port);

si.sin_addr.s_addr = 0;

int r = bind(ss, (sockaddr*)&si, len);

if(r < 0)

{

    cout<<"bind error"<<endl;

    close(ss);

    return -1;

}

char cmd;

sockaddr_in caddr;

char ip[100];

char msg[1000];

for(;;)

{

   cout<<"input a cmd : r/a/q/s"<<endl;

   cin>>cmd;

   switch(cmd)

   {

case 'r':

r = recvfrom(ss, msg, 1000, 0, (sockaddr*)&caddr, &len);

msg[r]= '\0';

port = ntohs(caddr.sin_port);

inet_ntop(AF_INET, &caddr.sin_addr.s_addr, ip, 100);

cout<<ip<<" @ "<<port<<" "<<msg<<endl;

break;

case 'a':

cin.getline(msg, 1000);

sendto(ss, msg, strlen(msg), 0, (sockaddr*)&caddr, len);

break;

case 's':

cout<<"input ip port:";

cin>>ip>>port;

cin.getline(msg, 1000);

caddr.sin_port = htons(port);

inet_pton(AF_INET, ip,  &caddr.sin_addr.s_addr);

caddr.sin_family = AF_INET;

sendto(ss, msg, strlen(msg), 0, (sockaddr*)&caddr, len);

break;

case 'q':

exit(0);

   }

}

   }

繼續閱讀