基於訊息的非同步套接字

2022-08-13 17:33:19 字數 2709 閱讀 6922

首先載入套接字型檔

#include  //套接字型檔標頭檔案

還需要為工程新增連線ws2_32.lib

word wversionrequested;

wsadata wsadata;

int err;

wversionrequested = makeword(2,2);

err = wsastartup(wversionrequested,&wsadata);

if(err != 0)

return false;

if(lobyte(wsadata.wversion) != 2 ||

hibyte(wsadata.wversion) !=2)

wsacleanup();

return false;

建立並初始化套接字

bool ::initsocket

m_socket = wsasocket(af_inet,sock_dgram,0,null,0,0); //m_scoket為scoket型別在標頭檔案中定義

if(invalid_socket == m_socket)

afxmessagebox("建立套接字失敗!");

return;

sockaddr_in addrsock;

addrsock.sin_addr.s_un.s_addr = htonl(inaddr_any); //htonl 將u_long從主機位元組順序轉換為tcp/ip網路位元組順序

addrsock.sin_family = af_inet;

addrsock.sin_port = htons(6000); //htons 將u_short從主機位元組順序轉換為tcp/ip網路位元組順序

if(socket_error == bind(m_socket,(sockaddr*)&addrsock,sizeof(sockaddr)))

afxmessagebox("繫結失敗! ");

return false;

if(socket_error == wsaasyncselect(m_socket,m_hwnd,um_sock,fd_read))  //um_sock自定義訊息,m_hwnd對話方塊視窗控制代碼

afxmessagebox("註冊網路讀取時間失敗!");

return false;

return true;

實現接收端功能

新增訊息響應函式

#define um_sock wm_user+1

afx_msg void onsock(wparam,lparam);

on_message(um_sock,onsock)

void ::onsock(wparam wparam,lparam lparam)

switch(loword(lparam))

case fd_read:

wsabuf wsabuf;

wsabuf.buf = new char[200];

wsabuf.len = 200;

dword dwread;

dword dwflag = 0;

sockaddr_in = addrfrom;

int len = sizeof(sockaddr);

cstring strl;

cstring strtemp;

if(socket_error == wsarecvfrom(m_socket,&wsabuf,1,&dwread,&dwflag,

(sockaddr*)&addrfrom,&len,null,null)

afxmessagebox("接收資料失敗!");

delete wsabuf.buf;

return;

實現傳送端功能

void ::onbtnsend()

dword dwip;

cstring strsend;

wsabuf wsabuf;

dword dwsend;

int len;

sockaddr_in addrto;

((cipaddressctrl*)getdlgitem(idc_ipassress1))->getaddress(dwip); //idc_ipassress1 ,ip控制項的id

addrto.sin_addr.s_un.s_addr = htonl(dwip);

addrto.sin_family = af_inet;

addrto.sin_port = htons(6000);

getdlgitemtext(idc_edit_send,strsend);  //傳送資料edit的id

len = strsend.getlength();

wsabuf.buf = strsend.getbuffer(len);

wsabuf.len = len + 1;

if(socket_error == wsasendto(m_socket,&wsabuf,1,&dwsend,0,

setdlgitemtext(idc_edit_send,""); //清空傳送編輯框

(sockaddr*)&addrto,sizeof(sockaddr),null,null))

afxmessagebox("是、傳送資料失敗!");

return;

終止套接字型檔的使用

wsacleanup();

關閉套接字

closesocket(m_socket);

基於訊息的非同步套接字程式設計

n n nwindows sockets 的非同步選擇函式 wsaasyncselect 提供了訊息 機制的網路事件選擇,當使用它登記的網路事件發生時,windows 應用程式相應的視窗函式將收到乙個訊息,訊息中指 示了發生的網路事件,以及與事件相關的一些資訊。windows sockets 為了支...

基於流式套接字的訊息收發

今天第一次寫部落格,不知學習python已經將近乙個半月了。經同學的推薦,於是想用部落格來記錄一點東西,也便於自己對於知識的梳理和總結。希望能在這裡結交到興趣相同的盆友,沒事可以交流交流程式設計思想!套接字 實現網路程式設計進行資料傳輸的一種技術手段。所謂流式套接字,是指以位元組流的方式進行資料傳輸...

非同步套接字

wsadata wsa wsastartup makeword 2,2 wsa socket fdserver socket af inet,sock stream,ipproto tcp struct sockaddr in server server.sin family af inet ser...