導航:首頁 > 文件教程 > mfcsocket編程教程

mfcsocket編程教程

發布時間:2024-11-02 17:05:38

㈠ MFC中socket編程時recv設置超時屬性後,如果超時返回值是什麼謝謝大家:)

超時,也是 返回: SOCKET_ERROR
用WSAGetLastError() 獲取 id 再分析,程序如下:

memset(buff,0x0,buff_size);
if (recv(sock,buff,sizeof(buff),0) == SOCKET_ERROR){
id = WSAGetLastError();
switch (id)
{
case WSANOTINITIALISED: printf("not initialized\n"); break;
case WSASYSNOTREADY: printf("sub sys not ready\n"); break;
case WSAHOST_NOT_FOUND: printf("name server not found\n"); break;
case WSATRY_AGAIN: printf("server fail\n"); break;
case WSANO_RECOVERY: printf("no recovery\n"); break;
case WSAEINPROGRESS: printf("socket blocked by other prog\n"); break;
case WSANO_DATA: printf("no data record\n"); break;
case WSAEINTR: printf("blocking call canciled\n"); break;
case WSAEPROCLIM: printf("limit exceeded\n");
case WSAEFAULT: printf("lpWSAData in startup not valid\n");
default: printf("unknown error id = %d\n",id); break;
};
printf("receive error.\n");
};

㈡ MFC是如何接收用套接字傳來的數據的

一、接收與發送過程:

伺服器端

1、創建伺服器套接字(CREATE)。

2、伺服器套接字進行信息綁定(BIND),並開始監聽連接(LISTEN)。

3、接受來自客戶端的連接請求(ACCEPT),並創建接收進程。

4、開始數據傳輸(SEND、RECEIVE)。

5、關閉套接字(CLOSESOCKET)。

客戶機端

1、創建客戶機套接字(CREATE)。

2、與遠程伺服器進行連接(CONNECT),如被接受則創建接收進程。

3、開始數據傳輸(SEND、RECEIVE)。

4、關閉套接字(CLOSESOCKET)。


二、在VC中的實現:

伺服器端:

一、建立支持SOCKET項目。

利用APP WIZARD創建MFC EXE項目,進行到WIZARD的第四步時,在「What features would you like include?」中,選中「Windows Sockets」項。其它各步驟各選項根據實際應用進行選擇即可。這樣創建的項目就已經支持SOCKET,並已經初始化了。

如果要在已有的項目中添加SOCKET支持,只須進行兩項工作:

1、在stdafx.h文件中包含頭文件WINSOCK.H (#include 「winsock.h」 )。

2、在應用程序類的成員函數:「::InitInstance()」中添加如下初始化套接字代碼

if(!AfxSocketInit())
{AfxMessageBox(IDP_SOCKETS_INIT_FAILED);returnFALSE;}

二、創建服務套接字並創建監聽線程。

//創建服務套接字
SOCKETsercon=socket(PF_INET,SOCK_STREAM,0);
//判斷是否成功創建
if(sercon==INVALID_SOCKET)
{AfxMessageBox(「ServerWRONG!」);return-1;}
//配置套接字地址等信息
SOCKADDR_INsin;
sin.sin_family=AF_INET;
//指定本地地址
sin.sin_addr.s_addr=htonl(INADDR_ANY);
//指定伺服器埠號nPort,可自設
intnPort=5080;
sin.sin_port=htons(nPort);
//地址信息與套接字進行綁定。
if(bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{AfxMessageBox(「bindwrong!」);return-1;}
//建立監聽隊列(大小為3),開始監聽
if(listen(sercon,3)==SOCKET_ERROR)
{AfxMessageBox(「listenwrong!」);return-1;};

①實現監聽線程,並創建數據接收線程。

//在程序需要開始監聽連接的地方創建監聽線程,並實現。

//創建監聽線程(在程序開始或按鈕事件實現中)

AfxBeginThread(waitconnect,NULL);

//實現監聽線程

UINT waitconnect(LPVOID lpParm)

{SOCKET conn[3];int lenc=sizeof(sockaddr);int alreadycon=0;//sercon為前面所創建伺服器套接字while(1){if (alreadycon<=3) {//接受連接請求conn[alreadycon]=accept(sercon,&cin,&lenc);if (conn[alreadycon]==INVALID_SOCKET){AfxMessageBox(「accept WRONG !」);}

else

{//創建數據接收線程

AfxBeginThread(readdata,&connn[alreadycon]);

Alreadycon= alreadycon+1;

return 0;}}

else

{//避免影響主線程運行

Sleep(200);}

}

}

②實現數據接收線程。

UINT waitconnect(LPVOID ss)

{ SOCKET *readsock;

readsock=(SOCKET *)ss;

char buf[2000];

int revnum=0;

//開始循環接受數據

while (revnum!=-1)

{//revnum<=0則表示連接已斷!

revnum=recv(*readsock,buf,2000,0);

if (revnum>0)

buf[revnum]=0;//截斷緩沖區

//buf中存儲已接受數據。}

}

③發送數據

//conn[1]為用於接受連接的套接字, sendstr為所發送數據。

send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);

④關閉套接字。

//conn[1]為用於接受連接的套接字

closesocket(conn[1]);

客戶程序端:

客戶端程序的編程有很多與伺服器端相同或相近,甚至相同的代碼。

一、建立支持SOCKET項目。

方法同伺服器端。

二、創建客戶套接字、對伺服器進行連接。

//nHost 須用戶指定的遠程服務機,IP或域名。

CString nHost;

//h為地址信息

struct hostent *h;

h=gethostbyname(nHost);

//nHost 須用戶指定的遠程服務埠號

int nPort;

SOCKET con_client;

SOCKADDR_IN csin;

if (h!=NULL)

{//創建套接字

con_client =socket(AF_INET,SOCK_STREAM,0);

csin.sin_family=AF_INET;

memcpy(&(csin.sin_addr.s_addr),h->h_addr,sizeof(int));

csin.sin_port=htons(nPort);

//開始連接

if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)))

{//AfxMessageBox(「connect wrong!」);

return -1;}

else

{//連接成功,創建數據接收線程

AfxBeginThread(readdata,&con_client);}

}

三、實現數據接收線程。

代碼與伺服器端完全相同。

四、發送數據。

//con_client 為與伺服器進行連接的套接字。

send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);

五、關閉套接字。

// con_client 為與伺服器進行連接的套接字。

closesocket(conn[1]);

在實際應用中,應當根據需要調整並改變一些變數的作用域。

閱讀全文

與mfcsocket編程教程相關的資料

熱點內容
api介面版本控制 瀏覽:579
iphone拍出虛焦 瀏覽:163
微信里的文件怎麼打開 瀏覽:653
炫舞空白印象代碼 瀏覽:345
維修用什麼編程器好 瀏覽:824
新建壓縮文件夾沒了 瀏覽:700
陽西哪裡招文件管理 瀏覽:324
騰訊文檔目錄文件名 瀏覽:509
編程指令s1s2q指的是什麼 瀏覽:205
快手下載安卓電視版 瀏覽:811
有哪些app可以搜大學 瀏覽:972
linux命令行連wifi 瀏覽:630
微信公眾賬號新年紅包 瀏覽:656
mfcsocket編程教程 瀏覽:461
樂動力蘋果版 瀏覽:54
qq怎麼幫別人充q幣 瀏覽:276
linux內存分配機制 瀏覽:454
惆悵qq表情 瀏覽:206
古城區網站搭建多少錢 瀏覽:64
st7565液晶12864串列程序 瀏覽:477

友情鏈接