mfc程式設計中,習慣使用csocket,而在控制台程式中只能使用socket套接字。若全為mfc,則其通訊比較容易.
服務端建立監聽套接字,並監聽:
clistensocket *clissoc = new clistensocket();
clissoc->create(5555,sock_stream,」127.0.0.1「);
clissoc->listen();
客戶端建立客戶端套接字,連線
cclientsocket *csock = new cclientsocket();
csock->create();
csock->connect("127.0.0.1",5555);
其中clistensocket,cclientsocket均為繼承於csocket的自定義類。
這樣可以完成套接字的連線。
然,要將mfc的csocket和控制台的socket連線 c1:
客戶端:
socket clients = socket(af_inet,sock_stream,0);
sockaddr_in sockserclient;
sockserclient.sin_family = af_inet;
sockserclient.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");
sockserclient.sin_port = 5555;
int len = sizeof(sockaddr);
int a = connect(clients,(sockaddr *)&sockserclient,len);
服務端:
clistensocket *clissoc = new clistensocket();
clissoc->create(5555,sock_stream,」127.0.0.1「);
clissoc->listen();
這樣會出現問題,在連線的時候會提示10061的錯誤,意思是強行拒絕連線。
在使用create方法建立套接字的時候實際上已經呼叫了bind的方法,如果再次呼叫bind方法會提示10022的錯誤,意思是已經繫結。
顯然這樣連線存在錯誤。csocket的connect過載了兩個方法:
bool connect( lpctstrlpszhostaddress, uintnhostport);
bool connect( const sockaddr*lpsockaddr, intnsockaddrlen);
若以csocket建立客戶端套接字:
sockaddr_in sockser;
sockser.sin_family = af_inet;
sockser.sin_addr.s_un.s_addr = inet_addr(m_ipaddr.c_str());
sockser.sin_port = m_nport;
int len = sizeof(sockaddr);
bool con = connect((sockaddr *)&sockser,len);
socket建立服務端套接字:
sockaddr_in addr;
addr.sin_family = af_inet;
addr.sin_port = 7777;
addr.sin_addr.s_un.s_addr =inet_addr("127.0.0.1");
bind(sersock, (sockaddr*)&addr, sizeof(sockaddr_in));
listen(sersock, 5); //5 表示同時允許有多少個連線請求
這樣是可以連線的。這樣看來,c1的解決方案也得使用socket,而不用create方法。最後查msdn,找到解決方案:
客戶端:
socket clients = socket(af_inet,sock_stream,0);
sockaddr_in sockserclient;
sockserclient.sin_family = af_inet;
sockserclient.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");
sockserclient.sin_port = 5555;
int len = sizeof(sockaddr);
int a = connect(clients,(sockaddr *)&sockserclient,len);
服務端:
clistensocket *clissoc = new clistensocket();
/***********代替create***********************************/
sockaddr_in sockser;
sockser.sin_family = af_inet;
sockser.sin_addr.s_un.s_addr = inet_addr(ipaddr);
sockser.sin_port = nport;
socket s = socket(af_inet,sock_stream,0);
clissoc->attach(s);
int len = sizeof(sockaddr);
int a = clissoc->bind((sockaddr*)&sockser,len);
int b = getlasterror();
clissoc->listen();
在我曾經的理解中,認為create()方法應該做了上述的操作了的,在msdn中也說create方法,會建立乙個window socket並附加到這個物件當中的。建立完之後需要呼叫bind,而實際使用過程中,呼叫了create(),基本上不用呼叫bind()方法,即使使用了,getlasterror()和提示10022的錯誤。至於為什麼c1會不能連線,目前還沒有想清楚,在解決之中。
C Socket學習筆記一
首先我們要了解一下幾點內容 1 網路中程序之間如何通訊?2 socket是什麼?3 socket的基本操作 3.1 socket 函式 3.2 bind 函式 3.3 listen connect 函式 3.4 accept 函式 3.5 read write 函式等 3.6 close 函式 4 ...
網路 c socket 學習筆記(一)
那麼c 是怎麼宣告套接字的呢 在宣告之前要加入標頭檔案 include progma comment lib,ws2 32 tcp socket sock socket pf inet,sock sdream,ipproto tcp udp socket sock socket pf inet,so...
C Socket程式設計筆記
1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單位 而這裡這個描述符則是用於描述網路訪問的。什麼意思呢?就是程式設計師可以通過socket來傳送和接收網路上的...