📄 wm_sock.c
字号:
#include "sock.h"
#include <winsock2.h>
#pragma comment(lib,"Ws2.lib")
struct wmsock
{
struct ISock vt;
SOCKET m_socket;
WSAEVENT m_hEventRead;
WSAEVENT m_hEventWrite;
WSAEVENT m_hEventConnect;
BOOL m_bConnected;
};
struct AStream * GetStreamFromSock(struct ISock *p)
{
return (struct AStream*)p;
}
static int wmsock_read(struct ISock * p, void * data, int cbData)
{
return recv(((struct wmsock*)p)->m_socket, (char*)data, cbData, 0);
}
static int wmsock_send(struct ISock * p, void * data, int cbData)
{
return send(((struct wmsock*)p)->m_socket, (char*)data, cbData, 0);
}
static struct AStream * wmsock_connect(struct ISock *p, char * hostname, uint16_t port)
{
struct wmsock * self = (struct wmsock *) p;
struct sockaddr_in sin;
memset((void *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.S_un.S_addr = inet_addr(hostname);
if (connect(self->m_socket, (struct sockaddr*)&sin, sizeof(sin)) != 0)
{
return (struct AStream *)NULL;
}
else
{
self->m_bConnected = TRUE;
return (struct AStream *)self;
}
}
static void wmsock_close(struct wmsock * p)
{
struct wmsock* self = (struct wmsock*)p;
if ( self->m_socket != INVALID_SOCKET)
{
self->m_bConnected = FALSE;
closesocket(self->m_socket);
self->m_socket = INVALID_SOCKET;
}
}
static wmsock_term(ISock * p)
{
struct wmsock * self = (struct wmsock *) p;
wmsock_close(self);
WSACleanup();
free(self);
}
struct ISock * InitSock(char * hostname, uint16_t port)
{
struct wmsock * sock;
SOCKET hSock;
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (hSock == INVALID_SOCKET)
{
return NULL;
}
sock = (struct wmsock *) malloc(sizeof(struct wmsock));
sock->m_socket = hSock;
sock->vt.Read = wmsock_read;
sock->vt.Write = wmsock_send;
sock->vt.Connect = wmsock_connect;
sock->vt.Release = wmsock_term;
sock->m_hEventRead =
sock->m_hEventConnect = sock->m_hEventWrite = NULL;
return (struct ISock*)sock;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -