Winsocket UDP Client and Server Examples

来源:互联网 发布:网络重置怎么弄 编辑:程序博客网 时间:2024/06/08 06:08
/*    Simple UDP Server    Silver Moon ( m00n.silv3r@gmail.com )*/ #include<stdio.h>#include<winsock2.h> #pragma comment(lib,"ws2_32.lib") //Winsock Library #define BUFLEN 512  //Max length of buffer#define PORT 8888   //The port on which to listen for incoming data int main(){    SOCKET s;    struct sockaddr_in server, si_other;    int slen , recv_len;    char buf[BUFLEN];    WSADATA wsa;     slen = sizeof(si_other) ;         //Initialise winsock    printf("\nInitialising Winsock...");    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)    {        printf("Failed. Error Code : %d",WSAGetLastError());        exit(EXIT_FAILURE);    }    printf("Initialised.\n");         //Create a socket    if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)    {        printf("Could not create socket : %d" , WSAGetLastError());    }    printf("Socket created.\n");         //Prepare the sockaddr_in structure    server.sin_family = AF_INET;    server.sin_addr.s_addr = INADDR_ANY;    server.sin_port = htons( PORT );         //Bind    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)    {        printf("Bind failed with error code : %d" , WSAGetLastError());        exit(EXIT_FAILURE);    }    puts("Bind done");     //keep listening for data    while(1)    {        printf("Waiting for data...");        fflush(stdout);                 //clear the buffer by filling null, it might have previously received data        memset(buf,'\0', BUFLEN);                 //try to receive some data, this is a blocking call        if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)        {            printf("recvfrom() failed with error code : %d" , WSAGetLastError());            exit(EXIT_FAILURE);        }                 //print details of the client/peer and the data received        printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));        printf("Data: %s\n" , buf);                 //now reply the client with the same data        if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)        {            printf("sendto() failed with error code : %d" , WSAGetLastError());            exit(EXIT_FAILURE);        }    }     closesocket(s);    WSACleanup();         return 0;}


/*    Simple udp client    Silver Moon (m00n.silv3r@gmail.com)*/#include<stdio.h>#include<winsock2.h> #pragma comment(lib,"ws2_32.lib") //Winsock Library #define SERVER "127.0.0.1"  //ip address of udp server#define BUFLEN 512  //Max length of buffer#define PORT 8888   //The port on which to listen for incoming data int main(void){    struct sockaddr_in si_other;    int s, slen=sizeof(si_other);    char buf[BUFLEN];    char message[BUFLEN];    WSADATA wsa;     //Initialise winsock    printf("\nInitialising Winsock...");    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)    {        printf("Failed. Error Code : %d",WSAGetLastError());        exit(EXIT_FAILURE);    }    printf("Initialised.\n");         //create socket    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)    {        printf("socket() failed with error code : %d" , WSAGetLastError());        exit(EXIT_FAILURE);    }         //setup address structure    memset((char *) &si_other, 0, sizeof(si_other));    si_other.sin_family = AF_INET;    si_other.sin_port = htons(PORT);    si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);         //start communication    while(1)    {        printf("Enter message : ");        gets(message);                 //send the message        if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)        {            printf("sendto() failed with error code : %d" , WSAGetLastError());            exit(EXIT_FAILURE);        }                 //receive a reply and print it        //clear the buffer by filling null, it might have previously received data        memset(buf,'\0', BUFLEN);        //try to receive some data, this is a blocking call        if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)        {            printf("recvfrom() failed with error code : %d" , WSAGetLastError());            exit(EXIT_FAILURE);        }                 puts(buf);    }     closesocket(s);    WSACleanup();     return 0;}

如果出现 

undefined reference to `__imp_WSACleanup'

之类的错误,可以在编译环境中加上一句

 -l"ws2_32"


然后就可以先运行server,再运行client,观察程序现象了。


0 0