登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[win32] Winsock 笔记(2) ---- Simple UDP Example  

2008-04-04 17:27:58|  分类: win32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
/* client.c */
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>

void errx(const _TCHAR *msg)
{
    _putts(msg);
    exit(-1);
}


void shutdown_network()
{
    WSACleanup();
    _putts(_T("network shutdown ..."));
}

void init_network()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        errx(_T("init network fail!"));
        exit(-1);
    }

    atexit(shutdown_network);
    _putts(_T("network init ..."));
}


int main(void)
{
    const char data[] = "abcdefgh";

    init_network();
   
    SOCKET serv_fd;
    serv_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if ( INVALID_SOCKET == serv_fd )
        errx(_T("socket() failed!"));


    struct sockaddr_in to_addr;
    to_addr.sin_family      = AF_INET;
    to_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    to_addr.sin_port        = htons(8888);

    _putts(_T("send data..."));
    sendto(serv_fd, data, sizeof(data)-1, 0, (struct sockaddr *) &to_addr, sizeof(to_addr));
    closesocket(serv_fd);

    return 0;
}


-----------------------------------------------------------------------------------
/* server.c */
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>

#include <stdlib.h>
#include <stdio.h>



void errx(const _TCHAR *msg)
{
    _putts(msg);
    exit(-1);
}


void shutdown_network()
{
    WSACleanup();
    _putts(_T("network shutdown ..."));
}

void init_network()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        errx(_T("init network fail!"));
        exit(-1);
    }

    atexit(shutdown_network);
    _putts(_T("network init ..."));
}


int main(void)
{
    char recv_buf[1024];
    int recv_nbytes;

    struct sockaddr_in from_addr;
    int from_addr_len = sizeof(from_addr);


    init_network();
   
    SOCKET listen_fd;
    listen_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if ( INVALID_SOCKET == listen_fd )
        errx(_T("socket() failed!"));


    struct sockaddr_in addr;
    addr.sin_family      = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port        = htons(8888);

    if ( bind(listen_fd, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR )
        errx(_T("bind() failed!"));

    while (1)
    {
        recv_nbytes = recvfrom(listen_fd, recv_buf, sizeof(recv_buf), 0,
                            (struct sockaddr *)&from_addr, &from_addr_len);

        if ( recv_nbytes == SOCKET_ERROR )
            errx(_T("recvfrom() failed!"));

        recv_buf[recv_nbytes] = '\0';
        printf("udp recv : %s\n", recv_buf);
    }

    closesocket(listen_fd);
    return 0;
}

-------------------
补充:windows 下面的 atexit() 似乎有问题,如果出错,会多次调用 atexit() 加入进去的 shutdown_network() 函数,很奇怪。也许是我自己没搞懂 atexit() 的机制。:-(

-------------------
2008-04-05
汗,不是 windows atexit() 的问题,而是自己写错了代码,原来 shutdown_network() 居然是这样写的:
void shutdown_network()
{
    WSACleanup();
    errx(_T("network shutdown ..."));      // exit() 又嵌套 exit() ... 汗
}
  评论这张
 
阅读(1358)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018