[win32] Winsock 笔记(2) ---- Simple UDP Example
2008-04-04 17:27:58| 分类:
win32
| 标签:
|举报
|字号大中小 订阅
/* 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() ... 汗
}
评论这张
转发至微博
转发至微博
评论