You are on page 1of 8

Lp trnh socket

LP TRNH NG DNG BNG WINDOWS SOCKET


Mc tiu:
Sau bi thc hnh ny, sinh vin c th: S dng c cc hm c bn trong Socket Lp trnh mt ng dng mng n gin bng socket

Ni dung chnh
Gii thiu socket Hng dn vit mt ng dng mng Server-Client bng socket Gii thiu mt s hm c bn ca lp CSocket. Minh ha ng dng chat n gin gia client v server

Socket
Sockets cung cp mt interface lp trnh mng ti tng Transport. Mt socket l

mt end-point ca mt lin kt gia hai ng dng. Ngy nay, Socket c h tr trong hu ht cc h iu hnh nh MS Windows (WinSock), Linux v c s dng trong nhiu ngn ng lp trnh khc nhau: nh C, C++, Java, Visual Basic, C#, . . . Windows Socket Application Programming Interface (Winsock API) l mt th vin cc hm socket. Winsock h tr cc lp trnh vin xy dng cc ng dng mng trn nn TCP/IP.

Xy dng ng dng Client-Server vi Socket


Khi xy dng mt ng dng mng, chng ta thc hin cc bc sau: 1. Xc nh kin trc mng: Client Server, Peer-to-Peer 2. Giao thc s dng tng Transport: TCP, UDP 3. Cc port s dng Server v Client 4. Giao thc tng ng dng khi trao i d liu gia hai end-host 5. Lp trnh Phn ny trnh by cc bc c bn trong vic xy dng cc ng dng mng theo

kin trc Client-Server v giao thc s dng tng Transport l TCP bng Socket.

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 1

Lp trnh socket
SERVER To socket lng nghe kt ni socket() ng k tn cho socket bind() Lng nghe kt ni t client listen()
i 1 kt ni n t Client

CLIENT

To socket kt ni n server socket()

Kt ni n server connect()

Chp nhn mt kt ni t Client (socket mi c to) accept() Truyn/nhn d liu send()/receive() ng kt ni (socket ca connection) close() Truyn/nhn d liu send()/receive()

ng kt ni close()

Hnh 1: S tng tc gia Server-Client theo giao thc TCP

Trong giai on truyn nhn d liu, vic trao i d liu gia Client v Server phi tun th theo giao thc ca ng dng. Ghi ch: nu chng ta pht trin ng dng theo cc giao thc nh ngha sn, chng ta phi tham kho v tun th ng nhng qui nh ca giao thc (tham kho trong cc ti liu RFC (Request For Comments)). Nu xy dng ng dng dng Peer-to-Peer, th mt ng dng phi c c chc nng client v server trong m hnh trn.

Mt s hm c bn trong lp CSocket

CSocket (mt lp c h tr trong MFC) l mt lp k tha t lp CAsynSocket dng

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 2

Lp trnh socket

qun l vic truyn v nhn d liu thng qua socket. Trong phn ny, chng ta s kho st mt s hm c bn trong lp CSocket. Cc hm khc cc bn tham kho trong MSDN: http://msdn.microsoft.com/en-US/library/65bbyctt%28v=VS.80%29.aspx Khi to Socket
BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );

Trc khi s dng cc hm ca lp CSocket, chng ta phi gi hm ny khi to Windows Socket vi tham s lpwsaData gn bng NULL. Nu lpwsaData khng bng NULL th a ch ca tham s ny phi ly t hm WSAStartup. To socket
BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL );

- nSocketPort: port ca socket; nu bng 0 th port s c MFC chn ngu nhin. - nSocketType l SOCK_STREAM (TCP) hay SOCK_DGRAM (UDP). - lpszSocketAddress: a ch IP ca host dng socket. Nu dng NULL, socket s lng nghe hot ng ca client trn tt c cc card mng. Gi tr tr v: khc 0 nu thnh cng; ngc li th bng 0 v m li c th s c cho khi gi hm GetLastError. Ghi ch: gii thch ca cc thnh phn s c s dng trong cc hm sau hm GetLastError dng ly m li c th khi xy ra li trong qu trnh thc hin cc hm. Do , cc hm v sau, nu c li th dng hm ny ly m li

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 3

Lp trnh socket

chi tit. ng k tn cc b cho socket


BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL ); BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen );

- lpSockAddr: tr n cu trc SOCKADDR cha a ch IP ca host dng socket. - nSockAddrLen: chiu di ca a ch lpSockAddr c tnh theo byte. Gi tr tr v: khc 0 nu thnh cng; ngc li bng 0. Gii phng/ng socket Close() Kt ni n server
BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ); BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );

- lpszHostAddress: a ch IP ca Server. - nHostPort: Port ca socket lng nghe kt ni trn Server. - lpSockAddr: tr n cu trc SOCKADDR cha a ch IP ca Server. - nSockAddrLen: chiu di ca a ch trong lpSockAddr c tnh theo byte.

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 4

Lp trnh socket

Gi tr tr v: khc 0 nu thnh cng; ngc li, tht bi = 0. Lng nghe cc yu cu kt ni


BOOL Listen( int nConnectionBacklog = 5 );

- Hm ny ch h tr cho socket dng SOCK_STREAM. - nConnectionBacklog: chiu di ti a m hng i kt ni cha c chp nhn c th tng. Min gi tr t 1 n 5. Gi tr tr v: khc 0 = thnh cng, bng 0 = tht bi. Chp nhn mt kt ni
virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL );

- rConnectedSocket: tham chiu nh danh socket ca kt ni c chp nhn. - lpSockAddr tr n cu trc SOCKADDR nhn a ch IP ca socket kt ni n. - Nu lpSockAddr hay lpSockAddrLen ly gi tr mc nh NULL th s khng c thng tin t socket (trn client) c chp nhn c tr v. - lpSockAddrlen cha chiu di thc s ca lpSockAddr khi tr v theo byte. Gi tr tr v: khc 0 nu thnh cng v bng 0 nu tht bi. Nhn d liu
virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 5

Lp trnh socket

- lpBuf: vng m cha d liu. - nBuffLen: kch thc ca vng m tnh theo byte. - nFlag: cch nhn d liu, s dng gi tr mc nh l 0. - Gi tr tr v l s byte nhn c, nu socket ng th gi tr tr v l 0, ngoi ra gi tr s tr v l SOCKET_ERROR. Gi d liu
virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0

);

- lpBuf: vng m cha d liu truyn i. - nBufLen: chiu di vng m. - nFlag: cch truyn d liu, s dng gi tr mc nh l 0. - Gi tr tr v l s k t c gi, nu tht bi gi tr tr v l SOCKET_ERROR.

Minh ha ng dng chat n gin


Bi ton: vit mt ng dng chat tun t gia Server Client (theo th t: server client server client ) bng Console. Qu trnh chat s kt thc khi mt trong hai bn g Exit 1. Xc nh kin trc mng: Client Server 2. Giao thc s dng tng Transport: TCP (d liu truyn gia client v server l text) 3. Cc port s dng Server v Client: Server - 1234 4. Giao thc tng ng dng khi trao i d liu gia hai end-host: server client server client

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 6

Lp trnh socket

format thng ip truyn gia client v server: <Chiu di thng ip><Thng ip> 5. Lp trnh: xem chi tit mc 4.1 v 4.2 4.1 Server Khai bo bin:
CSocket server, client;

Khi to Windows Socket


AfxSocketInit(NULL);

To socket lng nghe kt ni


if (!server.Create(1234)) { printf("Tao socket khong thanh cong"); exit(); } server.Listen();

Chp nhn kt ni ca Client


server.Accept(client)

Trao i thng ip vi Client


do { printf("\nServer: "); gets(s_str); len = strlen(s_str); client.Send(s_str,len,0); len = client.Receive(r_str,100,0); // gan ket thuc chuoi r_str[len] = 0;

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 7

Lp trnh socket // hien thi chuoi nhan duoc ra man hinh printf("\nCleint: %s",r_str); }while(strcmp(r_str,"exit")&&strcmp(s_str,"exit"));

ng kt ni v socket ca Server
client.Close(); server.Close();

4.2 Client Khai bo bin:


CSocket client;

Khi to Windows Socket


AfxSocketInit(NULL);

To socket kt ni n server
client.Create();

Connect n Server
client.Connect(svrAddr,1234)

Trao i thng ip vi Server


do { len = client.Receive(r_str,100,0); r_str[len] = 0; printf("\n Server: %s",r_str); printf("\n Client: "); gets(s_str); client.Send(s_str,strlen(s_str),0); }while(strcmp(r_str,"exit")&&strcmp(s_str,"exit"));

ng kt ni
client.Close();

BM MMT Khoa CNTT H KHTN Tp. HCM

Trang 8

You might also like