You are on page 1of 7

Hng dn lp trnh Socket

Link c nhiu v d mu bng C# (rt tic l khng c bi vit i km, ch c code) t c bn ti trung cp: SocketCoder.Com - Your Software to be Connected c bit vi ngi mi th nn c tng v d mt y: SocketCoder.Com - Articles (chn Category l Basic Network Programming sau c tng bi mt. Theo th t ca cc bi v d ny s gip bn tit kim rt nhiu thi gian tm hiu socket trong C#. CH : Ti rt hay gp cc bn sinh vin cn 1-2 tun phi np bi th m mm khp ni hi han. Ti mun NHN MNH vi cc bn l socket khng phi l ti n gin. Do ng ch quan. Bn cn dnh t nht 2-3 thng nghin ngm t t. Cn mun thnh master v distributed programming, c l cn 5-10 nm. Cch hc: - Vi cc bn qu gp rt phi np bi, lp tc nhai cho ht m examples trong mc basic networking programming trn. (xem thm mt s pointers bn di) - Vi cc bn mun dn thn su vo networking. Bn cn phi nm vng: a/ Threading (vng, threading cc quan trng khi lm vic vi socket. Bn cn nm r threading trong .net v nn bit thm khi nim threading ca h iu hnh) b/ Nm vng khi nim ca networking (topology, router, gateway, DNS, IP, DHCP). Bt buc phi nm Socket, UDP, TCP, HTTP. Ngoi ra bit thm cc protocol khc na th cng tt. - Vi cc bn mun thnh master vi distributed programming. Bn cn: a/ Nm Remoting, WebService, WCF, SOAP, XML-RPC, WS-E b/ Serialization (vng, serialization rt quan trng, y l k nng c bn rt hay b b qun). c/ Design Patterns, c bit l nhng khi nim lin quan ti concurrency, scalability, security, v interoperability. d/ Nm vng cc m hnh threading ca server (chng hn: single thread per connection, blocking, non-blocking, asynchronous, APM) e/ Nm vng cc m hnh events (polling, full-duplex, comet, ...) Mt s keyword nn tm hiu l: Dark Star Project, Google App Engine, Google Big Table, Hadoop, BitTorrent, KaZaa, Cloud Computing, Grid Computing. c bit cn c cc bi vit trn trang ny: High Scalability - High Scalability Trang ny rt hay, c cc bi vit m t kin trc ca nhng h thng thnh cng. Mt s pointer cho cc bn mi hc v Socket - C mt ch thng lm cc bn mi b kh hiu l vi client ch cn 1 socket l connect ti server. Nhng vi server, bn cn 01 + n sockets. Ngha l cn 1 socket listen for connection request. Socket ny c nhim v lng nghe xem client no mun kt ni. Khi kt ni vi mt client mi c thit lp th server s t ng c cp thm mt socket khc (vi port khc port ca socket dng listen). y chnh l socket bn gi d liu v cho client, ch khng phi socket ban u dng lng nghe connection request. Ni tm li, client ch c 1 socket, nhng server s c 1 socket chp nhn connection, v vi mi client s c thm 1 socket ring c, ghi d liu cho client tng ng. - Ln Google nm vng UDP v TCP khc nhau th no. iu ny rt quan trng. Cc v d trong .NET thng khng gii thch nhng im khc nhau. Quan trng nht cc bn cn nm l: + UDP does not guarantee delivery: ngha l mi ln gi d liu, nu dng UDP th khng bo m bn kia nhn c c. Cn TCP lun m bo gi l nhn. (Tr phi b t kt ni th chu) => cho chc n, c dng TCP. + TCP does not honor packet boundaries: ngha l TCP tuy m bo gi, nhng khng m bo kch thc, v d nu mnh gi 3 ln nh sau: "ABC" , "DEF", "GHI" th rt c th bn kia nhn l: "ABC" , "DEF", "GHI" hoc "ABCD", "EF", "GHI" hoc "ABCDEFG", "HI" ni chung TCP m bo min ti l c, cn ti th no l ty theo n. (y khng phi l nhc im, m l u im flow-control ca TCP). - Do c tnh ca TCP, nn cc bn mi quen hay b vp phi li rt c bn: em lm text chat th rt tt, nhng khi gi data nhiu nh file hoc hnh chng hn th lc lc thiu y chnh l do TCP khng honor packet bounds. + bo m d liu y , bn cn c mt class ring qun l d liu nhn c. Trong .NET c sn lp ny, tn ca n l NetworkStream. (Nu bn c tutorials s thy ngi ta hay dng ngay NetworkStream cho tin) - Lp trnh Socket trong .NET nhn chung c nhiu phng php ring bit, chng hn nh blocking, non-blocking, asynchronous, APM (Asynchronous Programming Model, ch c t .Net 3.5). Mi m hnh hot ng khc nhau hon ton. Khi mi bt u th dng TcpClient cho d xi, sau tm hiu qua cc m hnh trn. Happy programming!!! :-)

1.C ch gi hm trong lp trnh Socket

a.TCP

Lp trnh Socket vi TCP

b.UDP

Lp trnh Socket vi UDP

2.Th vin lp trnh Winsock

2.1. Khi ng v ng th vin


2.1.1. Khi ng Winsock
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

Cc tham s: - wVersionRequested l phin bn th vin m mnh s dng. y s l gi tr 00202 c ngha l phin bn 2.2. - lpWSData l mt s thng tin b sung s c tr v sau khi gi khi to Winsock 2.1.2. ng th vin Winsock
WSACleanup (void);

2.2. Window socket


2.2.1. To socket
SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

Cc tham s: af: [in] m t h a ch. type: [in] kiu ca socket. + SOCK_STREAM: TCP socket + SOCK_DGRAM: UDP socket -protocol: [in] nghi thc c s dng trn socket. + SOCK_DGREAM -> protocol l: IPPROTO_UDP + SOCK_STREAM -> protocol l: IPPROTO_IP + SOCK_RAW -> protocol c th l: IPPROTO_RAW hay IPPROTO_ICMP 2.2.2 Hm ly tn my mnh:
int gethostname(char* name, int namelen);

2.2.3Hm ly thng tin theo tn my:


struct hostent* FAR gethostbyname(const char* name);

* Cc tham s name: [in] tn ca my tnh cn phn gii. * Gi tr tr v Mt cu trc HOSTENT, nu thnh cng NULL, nu c li Trong hostent c nh ngha
typedef struct hostent { char FAR* h_name; // Tn my tnh char FAR FAR** h_aliases; // B danh my tnh short h_addrtype; // Kiu IP (AF_INET) short h_length; // Kch thc IP char FAR FAR** h_addr_list; // Danh sch cc a ch IP // 1 host c th c 1 hoc nhiu IP } HOSTENT,

2.2.4 Ly thng tin khi bit a ch IP


hostent* FAR gethostbyaddr(const char* addr, int len, int type);

Cc tham s addr: [in] a ch ca my tnh theo th t network-byte. len: [in] chiu di ca chui a ch

type: [in] kiu ca a ch, c thit lp l AF_INET. * Gi tr tr v Mt cu trc HOSTENT, nu thnh cng NULL, nu c li

2.3. TCP
2.3.1. Gn a ch cho socket
int bind( SOCKET s, const struct sockaddr FAR* name, int namelen )

Cc tham s s: [in] socket cha c gn kt a ch. name: [in] a ch c gn cho socket, mt cu trc SOCKADDR. namelen: [in] kch thc ca gi tr tham s name. * Gi tr tr v 0, nu thnh cng SOCKET_ERROR, nu c li. 2.3.2. Lng nghe kt ni
int listen( SOCKET s, int backlog );

* Cc tham s s: [in] socket c gn a ch nhng cha kt ni. backlog: [in] kch thc ti a ca hng i thit lp kt ni. Gi tr ti a c ch nh bng hng s SOMAXCONN. 2.3.3. Chp nht thit lp mt kt ni
SOCKET accept( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen )

* Cc tham s s: [in] socket ang lng nghe yu cu kt ni. addr: [out] a ch ca socket my client ang thc hin kt ni. addrlen: [out] chiu di thc s ca addr. Phi khi to gi tr ban u l kch thc ca addr * Gi tr tr v Mt SOCKET giao tip thc s vi client, nu thnh cng INVALID_SOCKET, nu c li 2.3.4. Thit lp mt kt ni
int connect( SOCKET s, const struct sockaddr FAR* name, int namelen )

* Cc tham s s: [in] socket cha kt ni. name: [in] socket cn kt ni n. namelen: [in] kch thc ca name. * Gi tr tr v 0, nu thnh cng SOCKET_ERROR, nu c li 2.3.5. Gi d liu
int send( SOCKET s, const char FAR * buf, int len, int flags )

* Cc tham s s: [in] socket kt ni. buf: [in] vng m cha d liu cn gi. len: [in] chiu di d liu trong buf. flags: [in] ch nh cch thc truyn d liu, truyn d liu bnh thng, thit lp gi tr 0. * Gi tr tr v s byte gi i, nu thnh cng

SOCKET_ERROR, nu c li. 2.3.6. Nhn d liu


int recv( SOCKET s, char FAR* buf, int len, int flags )

* Cc tham s s: [in] socket kt ni. buf: [out] vng m lu d liu nhn. len: [in] kch thc vng m buf. flags: [in] ch nh cch thc nhn d liu, nhn d liu bnh thng, thit lp gi tr 0. * Gi tr tr v s byte d liu nhn c, nu thnh cng SOCKET_ERROR, nu c li. 2.3.7 Shutdown
int shutdown( SOCKET s, int how )

* Cc tham s s: [in] socket cn shutdown. how: [in] ch nh nhng loi thao tc no khng thc hin na. o SD_RECEIVE: khng cho php gi cc hm recv() trn socket. o SD_SEND: khng cho php gi cc hm send() trn socket. o SD_BOTH: khng cho php gi c send() v recv() trn socket. * Gi tr tr v 0, nu thnh cng SOCKET_ERROR, nu c li 2.3.7 ng socket
int closesocket (SOCKET s)

* Cc tham s s: [in] socket cn ng.

3.Chng trnh demo


V sau y mnh s vit v d v chng trnh chat gia 2 my trong mng lan ng dng Server Client s dng TCP. Cc bn c th dowload project demo y

Sever:
view source print?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> #include <tchar.h> #include "iostream" #include <winsock2.h> using namespace std; #pragma comment (lib,"ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA SInfo; int iResult = WSAStartup(0x0202,&SInfo); SOCKET NewConnection,socketSever; socketSever =socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if (socketSever!=INVALID_SOCKET) { cout<<"\nKhoi tao socket thanh cong!!!\n"; } char DataGui[512]; char DataNhan[512]; //Thiet lap IP sever

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

sockaddr_in severAddr; severAddr.sin_family=AF_INET; severAddr.sin_port= htons(2000); severAddr.sin_addr.s_addr= INADDR_ANY; //Thiet lap IP client if (iResult==0) { if (bind(socketSever,(sockaddr*)&severAddr,sizeof(severAddr))==0) { int nSize; //Lang nghe if (listen(socketSever,5)==SOCKET_ERROR ) { cout<<"\nLang nghe that bai"; } else cout<<"Dang lang nghe ket noi..."; while(1) { nSize=sizeof(severAddr); NewConnection=accept(socketSever,(sockaddr*)&severAddr,&nSize); if (NewConnection==-1) { cout<<"\nLoi ket noi tu Client"; continue; } cout<<"\nKet noi thanh cong..!"; cout<<"\nNhan ket noi voi Client co IP: "<<inet_ntoa(severAddr.sin_addr); cout<<"\nBAT DAU NOI CHUYEN VOI NHAU"; while(1) { recv(NewConnection,(char*) &DataNhan,sizeof(DataNhan),0); cout<<"\nClient: "<<DataNhan; cout<<"\nSever: "; cin.getline(DataGui,512); send(NewConnection,(char*) &DataGui,sizeof(DataGui),0); } closesocket(NewConnection); } } else cout<<"\nThiet lap IP va Port cho socket that bai"; WSACleanup(); } else cout<<"Loi khoi dong Winsock"; system("PAUSE"); }

Client:
view source print?
01 02 03 04 05 06 07 08 09 #include <stdio.h> #include <tchar.h> #include "iostream" #include <winsock2.h> using namespace std; #pragma comment (lib,"ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA SInfo;

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

int iResult = WSAStartup(0x0202,&SInfo); //Thiet lap IP client char DataGui[512]; char DataNhan[512]; sockaddr_in clientAddr; char hostName[256]; struct hostent* serverHostent; int port=2000; if (iResult==0) { SOCKET socketClient =socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //Lay thong tin may chu qua ten cout<<"Enter host name : "; cin.getline(hostName,256); serverHostent=gethostbyname(hostName); if(serverHostent==NULL) { printf("Can not solve host \n"); } memset(&clientAddr,0,sizeof(clientAddr)); memcpy(&clientAddr.sin_addr,serverHostent->h_addr,serverHostent>h_length); clientAddr.sin_family=serverHostent->h_addrtype; clientAddr.sin_port=htons(port); //Yeu cau ket noi if (connect(socketClient,(sockaddr*)&clientAddr,sizeof(clientAddr))==0) { cout<<"\nKet noi thanh cong..!"; cout<<"\nNhan ket noi voi may chu co IP: "<<inet_ntoa(clientAddr.sin_addr); cout<<"\nBAT DAU NOI CHUYEN VOI NHAU"; while(1) { cout<<"\nClient: "; cin.getline(DataGui,512); send(socketClient,(char*)&DataGui,sizeof(DataGui),0); recv(socketClient,(char*)&DataNhan,sizeof(DataNhan),00); cout<<"\nSever: "<<DataNhan; } } else cout<<"Ket noi that bai"; WSACleanup(); } else cout<<"\nLoi khoi dong Winsock"; system("PAUSE"); }

You might also like