C socket學習筆記

2021-06-13 18:19:29 字數 3042 閱讀 5152

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來傳送和接收網路上的...