- 论坛徽章:
- 11
|
回复 9# wjtmain
靠: 首先使用这个函数创建 udp socket
int my_socket(int af, int type, int protocol)
{
SOCKET fd = WSASocket(af, type, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
if (fd == INVALID_SOCKET) {
int n = WSAGetLastError();
return -1;
}
if (type == SOCK_DGRAM) {
struct sockaddr_in in = {0};
in.sin_family = AF_INET;
in.sin_port = 0;
in.sin_addr.s_addr = INADDR_ANY;
int n = bind(fd, (struct sockaddr *) &in, sizeof(in));
if (n == -1) {
close(fd);
return -1;
}
}
return (int) fd;
}
然后加入 完成端口
再然后通过这个函数读数据:
int do_udp_read(int fd, struct my_buffer* mbuf)
{
io_context* ioc = (io_context *) mbuf;
DWORD flags = 0, bytes = 0;
struct sockaddr_in in;
int sz = sizeof(sockaddr);
int n = WSARecvFrom(fd, &ioc->wsa_buffer, 1, &bytes, &flags, (sockaddr *) &in, (LPINT) &flags, &ioc->overlap, NULL);
DWORD code = WSAGetLastError();
if (n == 0 || WSA_IO_PENDING == code) {
return 0;
}
errno = EFAILED;
return -1;
}
ioc->wsa_buffer 确定指向合法缓冲区
狗日的报 10014, 谁知道是为什么!!!!!!
妈的, 要不是我的网络代码是使用我自己在 linux 上用 epoll 实现的框架, 要移植到 windows 看样子只有完成端口才可行, 谁他妈的会用的烂东西, 操 |
|