⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wm_sock.c

📁 windows mobile上面实现的http协议
💻 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 + -