?? network.cpp
字號:
/*
* 網絡模塊
*/
#include "stdafx.h"
#include <WINSOCK2.H>
#include "options.h"
static SOCKET m_socket = -1;
int network_init(void)
{
WSADATA wsaData;
int iResult;
sockaddr_in service;
iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if (iResult != NO_ERROR)
{
printf("WSAStartup failed: %d\n",iResult);
return -1;
}
m_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (m_socket == INVALID_SOCKET)
{
printf("socket failed: %ld\n",WSAGetLastError());
WSACleanup();
return -2;
}
if (g_options.my_port)
{
service.sin_family = AF_INET;
service.sin_port = htons(g_options.my_port);
if (g_options.my_ip)
service.sin_addr.s_addr = inet_addr(g_options.my_ip);
else
service.sin_addr.s_addr = INADDR_ANY;
if (bind(m_socket,(SOCKADDR*)&service,sizeof(service)) == SOCKET_ERROR)
{
printf("bind failed: %ld\n",WSAGetLastError());
closesocket(m_socket);
WSACleanup();
return -3;
}
}
return 0;
}
int network_exit(void)
{
closesocket(m_socket);
WSACleanup();
return 0;
}
int network_send(unsigned char *data,int len)
{
int n;
sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(g_options.server_port);
dest.sin_addr.s_addr = inet_addr(g_options.server_ip);
n = sendto(m_socket,(const char*)data,len,0,(SOCKADDR*)&dest,sizeof(dest));
if ( n == SOCKET_ERROR)
{
printf("sendto failed: %ld\n",WSAGetLastError());
return -3;
}
return n;
}
int network_recv(unsigned char *data,int len)
{
fd_set r;
int n;
struct timeval tv;
sockaddr_in sender;
int slen = sizeof(sender);
FD_ZERO(&r);
FD_SET(m_socket,&r);
tv.tv_sec = g_options.recv_timeout;
tv.tv_usec = 0;
n = select(m_socket+1,&r,NULL,NULL,&tv);
if (n == 0)
{
printf("network_recv: timeout\n");
return -1;
}
if (n < 0)
{
printf("network_recv: select error\n");
return -2;
}
n = recvfrom(m_socket,(char*)data,len,0,(SOCKADDR*)&sender,&slen);
if ( n == SOCKET_ERROR)
{
printf("recvfrom failed: %ld\n",WSAGetLastError());
return -3;
}
return n;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -