Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
298 views

TutorialsPoint - Unix Socket Quick Guide

Unix Socket Quick Guide

Uploaded by

paolocollector
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
298 views

TutorialsPoint - Unix Socket Quick Guide

Unix Socket Quick Guide

Uploaded by

paolocollector
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

12/11/2016

UnixSocketQuickGuide

UnixSocketQuickGuide
https://www.tutorialspoint.com/unix_sockets/socket_quick_guide.htm
Copyrighttutorialspoint.com

WhatisaSocket?
Socketsallowcommunicationbetweentwodifferentprocessesonthesameordifferentmachines.Tobemore
precise,it'sawaytotalktoothercomputersusingstandardUnixfiledescriptors.InUnix,everyI/Oactionisdoneby
writingorreadingafiledescriptor.Afiledescriptorisjustanintegerassociatedwithanopenfileanditcanbea
networkconnection,atextfile,aterminal,orsomethingelse.
Toaprogrammer,asocketlooksandbehavesmuchlikealowlevelfiledescriptor.Thisisbecausecommandssuchas
read()andwrite()workwithsocketsinthesamewaytheydowithfilesandpipes.
Socketswerefirstintroducedin2.1BSDandsubsequentlyrefinedintotheircurrentformwith4.2BSD.Thesockets
featureisnowavailablewithmostcurrentUNIXsystemreleases.

WhereisSocketUsed?
AUnixSocketisusedinaclientserverapplicationframework.Aserverisaprocessthatperformssomefunctionson
requestfromaclient.MostoftheapplicationlevelprotocolslikeFTP,SMTP,andPOP3makeuseofsocketsto
establishconnectionbetweenclientandserverandthenforexchangingdata.

SocketTypes
Therearefourtypesofsocketsavailabletotheusers.Thefirsttwoaremostcommonlyusedandthelasttwoare
rarelyused.
Processesarepresumedtocommunicateonlybetweensocketsofthesametypebutthereisnorestrictionthat
preventscommunicationbetweensocketsofdifferenttypes.
StreamSocketsDeliveryinanetworkedenvironmentisguaranteed.Ifyousendthroughthestreamsocket
threeitems"A,B,C",theywillarriveinthesameorder"A,B,C".ThesesocketsuseTCP(Transmission
ControlProtocol)fordatatransmission.Ifdeliveryisimpossible,thesenderreceivesanerrorindicator.Data
recordsdonothaveanyboundaries.
DatagramSocketsDeliveryinanetworkedenvironmentisnotguaranteed.They'reconnectionlessbecause
youdon'tneedtohaveanopenconnectionasinStreamSocketsyoubuildapacketwiththedestination
informationandsenditout.TheyuseUDP(UserDatagramProtocol).
RawSocketsTheseprovideusersaccesstotheunderlyingcommunicationprotocols,whichsupportsocket
abstractions.Thesesocketsarenormallydatagramoriented,thoughtheirexactcharacteristicsaredependenton
theinterfaceprovidedbytheprotocol.Rawsocketsarenotintendedforthegeneralusertheyhavebeen
providedmainlyforthoseinterestedindevelopingnewcommunicationprotocols,orforgainingaccesstosome
ofthemorecrypticfacilitiesofanexistingprotocol.
SequencedPacketSocketsTheyaresimilartoastreamsocket,withtheexceptionthatrecordboundariesare
preserved.ThisinterfaceisprovidedonlyasapartoftheNetworkSystems(NS)socketabstraction,andisvery
importantinmostseriousNSapplications.Sequencedpacketsocketsallowtheusertomanipulatethe
SequencePacketProtocol(SPP)orInternetDatagramProtocol(IDP)headersonapacketoragroupof
packets,eitherbywritingaprototypeheaderalongwithwhateverdataistobesent,orbyspecifyingadefault
headertobeusedwithalloutgoingdata,andallowstheusertoreceivetheheadersonincomingpackets.

WhatisNext?
https://www.tutorialspoint.com/cgibin/printpage.cgi

1/26

12/11/2016

UnixSocketQuickGuide

ThenextfewchaptersaremeanttostrengthenyourbasicsandprepareafoundationbeforeyoucanwriteServerand
Clientprogramsusingsocket.Ifyoudirectlywanttojumptoseehowtowriteaclientandserverprogram,thenyou
candosobutitisnotrecommended.Itisstronglyrecommendedthatyougostepbystepandcompletetheseinitial
fewchapterstomakeyourbasebeforemovingontodoprogramming.

UnixSocketNetworkAddresses
Beforeweproceedwiththeactualstuff,letusdiscussabitabouttheNetworkAddressestheIPAddress.
TheIPhostaddress,ormorecommonlyjustIPaddress,isusedtoidentifyhostsconnectedtotheInternet.IPstands
forInternetProtocolandreferstotheInternetLayeroftheoverallnetworkarchitectureoftheInternet.
AnIPaddressisa32bitquantityinterpretedas48bitnumbersoroctets.EachIPaddressuniquelyidentifiesthe
participatingusernetwork,thehostonthenetwork,andtheclassoftheusernetwork.
AnIPaddressisusuallywritteninadotteddecimalnotationoftheformN1.N2.N3.N4,whereeachNiisadecimal
numberbetween0and255decimal(00throughFFhexadecimal).

AddressClasses
IPaddressesaremanagedandcreatedbytheInternetAssignedNumbersAuthority(IANA).Therearefivedifferent
addressclasses.YoucandeterminewhichclassanIPaddressisinbyexaminingthefirstfourbitsoftheIPaddress.
ClassAaddressesbeginwith0xxx,or1to126decimal.
ClassBaddressesbeginwith10xx,or128to191decimal.
ClassCaddressesbeginwith110x,or192to223decimal.
ClassDaddressesbeginwith1110,or224to239decimal.
ClassEaddressesbeginwith1111,or240to254decimal.
Addressesbeginningwith01111111,or127decimal,arereservedforloopbackandforinternaltestingonalocal
machine[Youcantestthis:youshouldalwaysbeabletoping127.0.0.1,whichpointstoyourself]ClassDaddresses
arereservedformulticastingClassEaddressesarereservedforfutureuse.Theyshouldnotbeusedforhost
addresses.

Example
Class Leftmostbits Startaddress Finishaddress
A
0xxx
0.0.0.0
127.255.255.255
B
10xx
128.0.0.0
191.255.255.255
C
110x
192.0.0.0
223.255.255.255
D
1110
224.0.0.0
239.255.255.255
E
1111
240.0.0.0
255.255.255.255

Subnetting
Subnettingorsubnetworkingbasicallymeanstobranchoffanetwork.Itcanbedoneforavarietyofreasonslike
networkinanorganization,useofdifferentphysicalmedia(suchasEthernet,FDDI,WAN,etc.),preservationof
addressspace,andsecurity.Themostcommonreasonistocontrolnetworktraffic.
ThebasicideainsubnettingistopartitionthehostidentifierportionoftheIPaddressintotwoparts
Asubnetaddresswithinthenetworkaddressitselfand
Ahostaddressonthesubnet.

https://www.tutorialspoint.com/cgibin/printpage.cgi

2/26

12/11/2016

UnixSocketQuickGuide

Forexample,acommonClassBaddressformatisN1.N2.S.H,whereN1.N2identifiestheClassBnetwork,the8bit
Sfieldidentifiesthesubnet,andthe8bitHfieldidentifiesthehostonthesubnet.

UnixSocketNetworkHostNames
Hostnamesintermsofnumbersaredifficulttorememberandhencetheyaretermedbyordinarynamessuchas
TakshilaorNalanda.WewritesoftwareapplicationstofindoutthedottedIPaddresscorrespondingtoagivenname.
TheprocessoffindingoutdottedIPaddressbasedonthegivenalphanumerichostnameisknownashostname
resolution.
Ahostnameresolutionisdonebyspecialsoftwareresidingonhighcapacitysystems.Thesesystemsarecalled
DomainNameSystems(DNS),whichkeepthemappingofIPaddressesandthecorrespondingordinarynames.

The/etc/hostsFile
ThecorrespondencebetweenhostnamesandIPaddressesismaintainedinafilecalledhosts.Onmostofthesystems,
thisfileisfoundin/etcdirectory.
Entriesinthisfilelooklikethefollowing
#Thisrepresentsacommentsin/etc/hostsfile.
127.0.0.1localhost
192.217.44.207nalandametro
153.110.31.18netserve
153.110.31.19mainservercenteral
153.110.31.20samsonite
64.202.167.10ns3.secureserver.net
64.202.167.97ns4.secureserver.net
66.249.89.104www.google.com
68.178.157.132services.amrood.com

NotethatmorethanonenamemaybeassociatedwithagivenIPaddress.ThisfileisusedwhileconvertingfromIP
addresstohostnameandviceversa.
Youwouldnothaveaccesstoeditthisfile,soifyouwanttoputanyhostnamealongwithIPaddress,thenyouwould
needtohaverootpermission.

UnixSocketClientServerModel
MostoftheNetApplicationsusetheClientServerarchitecture,whichreferstotwoprocessesortwoapplications
thatcommunicatewitheachothertoexchangesomeinformation.Oneofthetwoprocessesactsasaclientprocess,
andanotherprocessactsasaserver.

ClientProcess
Thisistheprocess,whichtypicallymakesarequestforinformation.Aftergettingtheresponse,thisprocessmay
terminateormaydosomeotherprocessing.
Example,InternetBrowserworksasaclientapplication,whichsendsarequesttotheWebServertogetoneHTML
webpage.

ServerProcess
Thisistheprocesswhichtakesarequestfromtheclients.Aftergettingarequestfromtheclient,thisprocesswill
performtherequiredprocessing,gathertherequestedinformation,andsendittotherequestorclient.Oncedone,it
becomesreadytoserveanotherclient.Serverprocessesarealwaysalertandreadytoserveincomingrequests.
ExampleWebServerkeepswaitingforrequestsfromInternetBrowsersandassoonasitgetsanyrequestfroma
browser,itpicksuparequestedHTMLpageandsendsitbacktothatBrowser.
https://www.tutorialspoint.com/cgibin/printpage.cgi

3/26

12/11/2016

UnixSocketQuickGuide

Notethattheclientneedstoknowtheaddressoftheserver,buttheserverdoesnotneedtoknowtheaddressoreven
theexistenceoftheclientpriortotheconnectionbeingestablished.Onceaconnectionisestablished,bothsidescan
sendandreceiveinformation.

2tierand3tierarchitectures
Therearetwotypesofclientserverarchitectures
2tierarchitectureInthisarchitecture,theclientdirectlyinteractswiththeserver.Thistypeofarchitecture
mayhavesomesecurityholesandperformanceproblems.InternetExplorerandWebServerworkontwotier
architecture.HeresecurityproblemsareresolvedusingSecureSocketLayer(SSL).
3tierarchitecturesInthisarchitecture,onemoresoftwaresitsinbetweentheclientandtheserver.This
middlesoftwareiscalledmiddleware.Middlewareareusedtoperformallthesecuritychecksandload
balancingincaseofheavyload.Amiddlewaretakesallrequestsfromtheclientandafterperformingthe
requiredauthentication,itpassesthatrequesttotheserver.Thentheserverdoestherequiredprocessingand
sendstheresponsebacktothemiddlewareandfinallythemiddlewarepassesthisresponsebacktotheclient.If
youwanttoimplementa3tierarchitecture,thenyoucankeepanymiddlewarelikeWebLogicorWebSphere
softwareinbetweenyourWebServerandWebBrowser.

TypesofServer
Therearetwotypesofserversyoucanhave
IterativeServerThisisthesimplestformofserverwhereaserverprocessservesoneclientandafter
completingthefirstrequest,ittakesrequestfromanotherclient.Meanwhile,anotherclientkeepswaiting.
ConcurrentServersThistypeofserverrunsmultipleconcurrentprocessestoservemanyrequestsatatime
becauseoneprocessmaytakelongerandanotherclientcannotwaitforsolong.Thesimplestwaytowritea
concurrentserverunderUnixistoforkachildprocesstohandleeachclientseparately.

HowtoMakeClient
Thesystemcallsforestablishingaconnectionaresomewhatdifferentfortheclientandtheserver,butbothinvolve
thebasicconstructofasocket.Boththeprocessesestablishtheirownsockets.
Thestepsinvolvedinestablishingasocketontheclientsideareasfollows
Createasocketwiththesocket()systemcall.
Connectthesockettotheaddressoftheserverusingtheconnect()systemcall.
Sendandreceivedata.Thereareanumberofwaystodothis,butthesimplestwayistousetheread()and
write()systemcalls.

HowtomakeaServer
Thestepsinvolvedinestablishingasocketontheserversideareasfollows
Createasocketwiththesocket()systemcall.
Bindthesockettoanaddressusingthebind()systemcall.ForaserversocketontheInternet,anaddress
consistsofaportnumberonthehostmachine.
Listenforconnectionswiththelisten()systemcall.
Acceptaconnectionwiththeaccept()systemcall.Thiscalltypicallyblockstheconnectionuntilaclient
connectswiththeserver.
Sendandreceivedatausingtheread()andwrite()systemcalls.
https://www.tutorialspoint.com/cgibin/printpage.cgi

4/26

12/11/2016

UnixSocketQuickGuide

ClientandServerInteraction
FollowingisthediagramshowingthecompleteClientandServerinteraction

UnixSocketStructures
VariousstructuresareusedinUnixSocketProgrammingtoholdinformationabouttheaddressandport,andother
information.Mostsocketfunctionsrequireapointertoasocketaddressstructureasanargument.Structuresdefined
inthischapterarerelatedtoInternetProtocolFamily.

sockaddr
Thefirststructureissockaddrthatholdsthesocketinformation
structsockaddr{
unsignedshortsa_family;
charsa_data[14];
};

Thisisagenericsocketaddressstructure,whichwillbepassedinmostofthesocketfunctioncalls.Thefollowing
tableprovidesadescriptionofthememberfields
Attribute

Values

Description

AF_INET
https://www.tutorialspoint.com/cgibin/printpage.cgi

5/26

12/11/2016

UnixSocketQuickGuide

AF_UNIX
sa_family

AF_NS

Itrepresentsanaddressfamily.InmostoftheInternetbasedapplications,weuse
AF_INET.

AF_IMPLINK
sa_data

Protocol
specific
Address

Thecontentofthe14bytesofprotocolspecificaddressareinterpretedaccordingtothe
typeofaddress.FortheInternetfamily,wewilluseportnumberIPaddress,whichis
representedbysockaddr_instructuredefinedbelow.

sockaddrin
Thesecondstructurethathelpsyoutoreferencetothesocket'selementsisasfollows
structsockaddr_in{
shortintsin_family;
unsignedshortintsin_port;
structin_addrsin_addr;
unsignedcharsin_zero[8];
};

Hereisthedescriptionofthememberfields
Attribute

Values

Description

AF_INET
sa_family

AF_UNIX
AF_NS

Itrepresentsanaddressfamily.InmostoftheInternetbasedapplications,weuse
AF_INET.

AF_IMPLINK
sin_port ServicePort
sin_addr IPAddress
sin_zero NotUsed

A16bitportnumberinNetworkByteOrder.
A32bitIPaddressinNetworkByteOrder.
YoujustsetthisvaluetoNULLasthisisnotbeingused.

inaddr
Thisstructureisusedonlyintheabovestructureasastructurefieldandholds32bitnetid/hostid.
structin_addr{
unsignedlongs_addr;
};

Hereisthedescriptionofthememberfields
Attribute Values
Description
s_addr
serviceport A32bitIPaddressinNetworkByteOrder.

hostent
Thisstructureisusedtokeepinformationrelatedtohost.
structhostent{
char*h_name;
char**h_aliases;
inth_addrtype;
inth_length;
char**h_addr_list

https://www.tutorialspoint.com/cgibin/printpage.cgi

6/26

12/11/2016

UnixSocketQuickGuide

#defineh_addrh_addr_list[0]
};

Hereisthedescriptionofthememberfields
Attribute

Values
Description
ti.com
h_name
Itistheofficialnameofthehost.Forexample,tutorialspoint.com,google.com,etc.
etc.
h_aliases TI
Itholdsalistofhostnamealiases.
ItcontainstheaddressfamilyandincaseofInternetbasedapplication,itwillalwaysbe
h_addrtype AF_INET
AF_INET.
h_length 4
ItholdsthelengthoftheIPaddress,whichis4forInternetAddress.
ForInternetaddresses,thearrayofpointersh_addr_list[0],h_addr_list[1],andsoon,are
h_addr_list in_addr
pointstostructurein_addr.
NOTEh_addrisdefinedash_addr_list[0]tokeepbackwardcompatibility.

servent
Thisparticularstructureisusedtokeepinformationrelatedtoserviceandassociatedports.
structservent{
char*s_name;
char**s_aliases;
ints_port;
char*s_proto;
};

Hereisthedescriptionofthememberfields
Attribute Values
Description
s_name http
Thisistheofficialnameoftheservice.Forexample,SMTP,FTPPOP3,etc.
s_aliases ALIAS Itholdsthelistofservicealiases.MostofthetimethiswillbesettoNULL.
s_port
80
Itwillhaveassociatedportnumber.Forexample,forHTTP,thiswillbe80.
s_proto

TCP
UDP

Itissettotheprotocolused.InternetservicesareprovidedusingeitherTCPorUDP.

TipsonSocketStructures
Socketaddressstructuresareanintegralpartofeverynetworkprogram.Weallocatethem,fillthemin,andpass
pointerstothemtovarioussocketfunctions.Sometimeswepassapointertooneofthesestructurestoasocket
functionanditfillsinthecontents.
Wealwayspassthesestructuresbyreference(i.e.,wepassapointertothestructure,notthestructureitself),andwe
alwayspassthesizeofthestructureasanotherargument.
Whenasocketfunctionfillsinastructure,thelengthisalsopassedbyreference,sothatitsvaluecanbeupdatedby
thefunction.Wecallthesevalueresultarguments.
Always,setthestructurevariablestoNULL(i.e.,'\0')byusingmemset()forbzero()functions,otherwiseitmayget
unexpectedjunkvaluesinyourstructure.

UnixSocketPortsandServices
Whenaclientprocesswantstoaconnectaserver,theclientmusthaveawayofidentifyingtheserverthatitwantsto
connect.Iftheclientknowsthe32bitInternetaddressofthehostonwhichtheserverresides,itcancontactthathost.
https://www.tutorialspoint.com/cgibin/printpage.cgi

7/26

12/11/2016

UnixSocketQuickGuide

Buthowdoestheclientidentifytheparticularserverprocessrunningonthathost?
Toresolvetheproblemofidentifyingaparticularserverprocessrunningonahost,bothTCPandUDPhavedefineda
groupofwellknownports.
Forourpurpose,aportwillbedefinedasanintegernumberbetween1024and65535.Thisisbecauseallport
numberssmallerthan1024areconsideredwellknownforexample,telnetusesport23,httpuses80,ftpuses21,
andsoon.
Theportassignmentstonetworkservicescanbefoundinthefile/etc/services.Ifyouarewritingyourownserver
thencaremustbetakentoassignaporttoyourserver.Youshouldmakesurethatthisportshouldnotbeassignedto
anyotherserver.
Normallyitisapracticetoassignanyportnumbermorethan5000.Buttherearemanyorganizationswhohave
writtenservershavingportnumbersmorethan5000.Forexample,YahooMessengerrunson5050,SIPServerruns
on5060,etc.

ExamplePortsandServices
Hereisasmalllistofservicesandassociatedports.Youcanfindthemostupdatedlistofinternetportsandassociated
serviceatIANATCP/IPPortAssignments.
Service PortNumber
echo
7
discard 9
daytime 13
chargen 19
ftp
21
telnet 23
smtp
25
daytime 37
tftp
69
finger 79
http
80
login 513
who
513
Xserver 6000

ServiceDescription
UDP/TCPsendsbackwhatitreceives.
UDP/TCPthrowsawayinput.
UDP/TCPreturnsASCIItime.
UDP/TCPreturnscharacters.
TCPfiletransfer.
TCPremotelogin.
TCPemail.
UDP/TCPreturnsbinarytime.
UDPtrivialfiletransfer.
TCPinfoonusers.
TCPWorldWideWeb.
TCPremotelogin.
UDPdifferentinfoonusers.
TCPXwindows(N.B.>1023).

PortandServiceFunctions
Unixprovidesthefollowingfunctionstofetchservicenamefromthe/etc/servicesfile.
structservent*getservbyname(char*name,char*proto)Thiscalltakesservicenameandprotocolname,
andreturnsthecorrespondingportnumberforthatservice.
structservent*getservbyport(intport,char*proto)Thiscalltakesportnumberandprotocolname,and
returnsthecorrespondingservicename.
Thereturnvalueforeachfunctionisapointertoastructurewiththefollowingform
structservent{
char*s_name;
char**s_aliases;
ints_port;
char*s_proto;
};

Hereisthedescriptionofthememberfields
https://www.tutorialspoint.com/cgibin/printpage.cgi

8/26

12/11/2016

UnixSocketQuickGuide

Attribute Values
Description
s_name http
Itistheofficialnameoftheservice.Forexample,SMTP,FTPPOP3,etc.
s_aliases ALIAS Itholdsthelistofservicealiases.Mostofthetime,itwillbesettoNULL.
s_port
80
Itwillhavetheassociatedportnumber.Forexample,forHTTP,itwillbe80.
s_proto

TCP
UDP

Itissettotheprotocolused.InternetservicesareprovidedusingeitherTCPorUDP.

UnixSocketNetworkByteOrders
Unfortunately,notallcomputersstorethebytesthatcompriseamultibytevalueinthesameorder.Considera16bit
internetthatismadeupof2bytes.Therearetwowaystostorethisvalue.
LittleEndianInthisscheme,loworderbyteisstoredonthestartingaddress(A)andhighorderbyteis
storedonthenextaddress(A+1).
BigEndianInthisscheme,highorderbyteisstoredonthestartingaddress(A)andloworderbyteisstored
onthenextaddress(A+1).
Toallowmachineswithdifferentbyteorderconventionscommunicatewitheachother,theInternetprotocolsspecify
acanonicalbyteorderconventionfordatatransmittedoverthenetwork.ThisisknownasNetworkByteOrder.
WhileestablishinganInternetsocketconnection,youmustmakesurethatthedatainthesin_portandsin_addr
membersofthesockaddr_instructurearerepresentedinNetworkByteOrder.

ByteOrderingFunctions
Routinesforconvertingdatabetweenahost'sinternalrepresentationandNetworkByteOrderareasfollows
Function
Description
htons() HosttoNetworkShort
htonl() HosttoNetworkLong
ntohl() NetworktoHostLong
ntohs() NetworktoHostShort
Listedbelowaresomemoredetailaboutthesefunctions
unsignedshorthtons(unsignedshorthostshort)Thisfunctionconverts16bit(2byte)quantitiesfromhost
byteordertonetworkbyteorder.
unsignedlonghtonl(unsignedlonghostlong)Thisfunctionconverts32bit(4byte)quantitiesfromhost
byteordertonetworkbyteorder.
unsignedshortntohs(unsignedshortnetshort)Thisfunctionconverts16bit(2byte)quantitiesfrom
networkbyteordertohostbyteorder.
unsignedlongntohl(unsignedlongnetlong)Thisfunctionconverts32bitquantitiesfromnetworkbyte
ordertohostbyteorder.
Thesefunctionsaremacrosandresultintheinsertionofconversionsourcecodeintothecallingprogram.Onlittle
endianmachines,thecodewillchangethevaluesaroundtonetworkbyteorder.Onbigendianmachines,nocodeis
insertedsincenoneisneededthefunctionsaredefinedasnull.

ProgramtoDetermineHostByteOrder
Keepthefollowingcodeinafilebyteorder.candthencompileitandrunitoveryourmachine.
https://www.tutorialspoint.com/cgibin/printpage.cgi

9/26

12/11/2016

UnixSocketQuickGuide

Inthisexample,westorethetwobytevalue0x0102intheshortintegerandthenlookatthetwoconsecutivebytes,
c[0](theaddressA)andc[1](theaddressA+1)todeterminethebyteorder.
#include<stdio.h>
intmain(intargc,char**argv){
union{
shorts;
charc[sizeof(short)];
}un;

un.s=0x0102;

if(sizeof(short)==2){
if(un.c[0]==1&&un.c[1]==2)
printf("bigendian\n");

elseif(un.c[0]==2&&un.c[1]==1)
printf("littleendian\n");

else
printf("unknown\n");
}
else{
printf("sizeof(short)=%d\n",sizeof(short));
}

exit(0);
}

AnoutputgeneratedbythisprogramonaPentiummachineisasfollows
$>gccbyteorder.c
$>./a.out
littleendian
$>

UnixSocketIPAddressFunctions
UnixprovidesvariousfunctioncallstohelpyoumanipulateIPaddresses.ThesefunctionsconvertInternetaddresses
betweenASCIIstrings(whathumansprefertouse)andnetworkbyteorderedbinaryvalues(valuesthatarestoredin
socketaddressstructures).
ThefollowingthreefunctioncallsareusedforIPv4addressing
intinet_aton(constchar*strptr,structin_addr*addrptr)
in_addr_tinet_addr(constchar*strptr)
char*inet_ntoa(structin_addrinaddr)

intinet_aton(constchar*strptr,structin_addr*addrptr)
ThisfunctioncallconvertsthespecifiedstringintheInternetstandarddotnotationtoanetworkaddress,andstores
theaddressinthestructureprovided.TheconvertedaddresswillbeinNetworkByteOrder(bytesorderedfromleft
toright).Itreturns1ifthestringwasvalidand0onerror.
Followingistheusageexample
#include<arpa/inet.h>
(...)
intretval;
structin_addraddrptr

memset(&addrptr,'\0',sizeof(addrptr));
retval=inet_aton("68.178.157.132",&addrptr);
https://www.tutorialspoint.com/cgibin/printpage.cgi

10/26

12/11/2016

UnixSocketQuickGuide

(...)

in_addr_tinet_addr(constchar*strptr)
ThisfunctioncallconvertsthespecifiedstringintheInternetstandarddotnotationtoanintegervaluesuitableforuse
asanInternetaddress.TheconvertedaddresswillbeinNetworkByteOrder(bytesorderedfromlefttoright).It
returnsa32bitbinarynetworkbyteorderedIPv4addressandINADDR_NONEonerror.
Followingistheusageexample
#include<arpa/inet.h>
(...)
structsockaddr_indest;
memset(&dest,'\0',sizeof(dest));
dest.sin_addr.s_addr=inet_addr("68.178.157.132");

(...)

char*inet_ntoa(structin_addrinaddr)
ThisfunctioncallconvertsthespecifiedInternethostaddresstoastringintheInternetstandarddotnotation.
Followingistheusageexample
#include<arpa/inet.h>
(...)
char*ip;

ip=inet_ntoa(dest.sin_addr);

printf("IPAddressis:%s\n",ip);

(...)

UnixSocketCoreFunctions
ThischapterdescribesthecoresocketfunctionsrequiredtowriteacompleteTCPclientandserver.
ThefollowingdiagramshowsthecompleteClientandServerinteraction

https://www.tutorialspoint.com/cgibin/printpage.cgi

11/26

12/11/2016

UnixSocketQuickGuide

ThesocketFunction
ToperformnetworkI/O,thefirstthingaprocessmustdois,callthesocketfunction,specifyingthetypeof
communicationprotocoldesiredandprotocolfamily,etc.
#include<sys/types.h>
#include<sys/socket.h>
intsocket(intfamily,inttype,intprotocol);

Thiscallreturnsasocketdescriptorthatyoucanuseinlatersystemcallsor1onerror.

Parameters
familyItspecifiestheprotocolfamilyandisoneoftheconstantsshownbelow
Family
Description
AF_INET IPv4protocols
AF_INET6 IPv6protocols
AF_LOCAL Unixdomainprotocols
AF_ROUTE RoutingSockets
AF_KEY
Ketsocket
ThischapterdoesnotcoverotherprotocolsexceptIPv4.
typeItspecifiesthekindofsocketyouwant.Itcantakeoneofthefollowingvalues
https://www.tutorialspoint.com/cgibin/printpage.cgi

12/26

12/11/2016

UnixSocketQuickGuide

Type
Description
SOCK_STREAM
Streamsocket
SOCK_DGRAM
Datagramsocket
SOCK_SEQPACKET Sequencedpacketsocket
SOCK_RAW
Rawsocket
protocolTheargumentshouldbesettothespecificprotocoltypegivenbelow,or0toselectthesystem'sdefaultfor
thegivencombinationoffamilyandtype
Protocol
Description
IPPROTO_TCP TCPtransportprotocol
IPPROTO_UDP UDPtransportprotocol
IPPROTO_SCTP SCTPtransportprotocol

TheconnectFunction
TheconnectfunctionisusedbyaTCPclienttoestablishaconnectionwithaTCPserver.
#include<sys/types.h>
#include<sys/socket.h>
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);

Thiscallreturns0ifitsuccessfullyconnectstotheserver,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
serv_addrItisapointertostructsockaddrthatcontainsdestinationIPaddressandport.
addrlenSetittosizeof(structsockaddr).

ThebindFunction
Thebindfunctionassignsalocalprotocoladdresstoasocket.WiththeInternetprotocols,theprotocoladdressisthe
combinationofeithera32bitIPv4addressora128bitIPv6address,alongwitha16bitTCPorUDPportnumber.
ThisfunctioniscalledbyTCPserveronly.
#include<sys/types.h>
#include<sys/socket.h>
intbind(intsockfd,structsockaddr*my_addr,intaddrlen);

Thiscallreturns0ifitsuccessfullybindstotheaddress,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
my_addrItisapointertostructsockaddrthatcontainsthelocalIPaddressandport.
addrlenSetittosizeof(structsockaddr).
YoucanputyourIPaddressandyourportautomatically
A0valueforportnumbermeansthatthesystemwillchoosearandomport,andINADDR_ANYvalueforIPaddress
meanstheserver'sIPaddresswillbeassignedautomatically.
server.sin_port=0;

server.sin_addr.s_addr=INADDR_ANY;
https://www.tutorialspoint.com/cgibin/printpage.cgi

13/26

12/11/2016

UnixSocketQuickGuide

NOTEAllportsbelow1024arereserved.Youcansetaportabove1024andbelow65535unlesstheyaretheones
beingusedbyotherprograms.

ThelistenFunction
ThelistenfunctioniscalledonlybyaTCPserveranditperformstwoactions
Thelistenfunctionconvertsanunconnectedsocketintoapassivesocket,indicatingthatthekernelshould
acceptincomingconnectionrequestsdirectedtothissocket.
Thesecondargumenttothisfunctionspecifiesthemaximumnumberofconnectionsthekernelshouldqueue
forthissocket.
#include<sys/types.h>
#include<sys/socket.h>
intlisten(intsockfd,intbacklog);

Thiscallreturns0onsuccess,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
backlogItisthenumberofallowedconnections.

TheacceptFunction
TheacceptfunctioniscalledbyaTCPservertoreturnthenextcompletedconnectionfromthefrontofthecompleted
connectionqueue.Thesignatureofthecallisasfollows
#include<sys/types.h>
#include<sys/socket.h>
intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);

Thiscallreturnsanonnegativedescriptoronsuccess,otherwiseitreturns1onerror.Thereturneddescriptoris
assumedtobeaclientsocketdescriptorandallreadwriteoperationswillbedoneonthisdescriptortocommunicate
withtheclient.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
cliaddrItisapointertostructsockaddrthatcontainsclientIPaddressandport.
addrlenSetittosizeof(structsockaddr).

ThesendFunction
ThesendfunctionisusedtosenddataoverstreamsocketsorCONNECTEDdatagramsockets.Ifyouwanttosend
dataoverUNCONNECTEDdatagramsockets,youmustusesendto()function.
Youcanusewrite()systemcalltosenddata.Itssignatureisasfollows
intsend(intsockfd,constvoid*msg,intlen,intflags);

Thiscallreturnsthenumberofbytessentout,otherwiseitwillreturn1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
https://www.tutorialspoint.com/cgibin/printpage.cgi

14/26

12/11/2016

UnixSocketQuickGuide

msgItisapointertothedatayouwanttosend.
lenItisthelengthofthedatayouwanttosend(inbytes).
flagsItissetto0.

TherecvFunction
TherecvfunctionisusedtoreceivedataoverstreamsocketsorCONNECTEDdatagramsockets.Ifyouwantto
receivedataoverUNCONNECTEDdatagramsocketsyoumustuserecvfrom().
Youcanuseread()systemcalltoreadthedata.Thiscallisexplainedinhelperfunctionschapter.
intrecv(intsockfd,void*buf,intlen,unsignedintflags);

Thiscallreturnsthenumberofbytesreadintothebuffer,otherwiseitwillreturn1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
bufItisthebuffertoreadtheinformationinto.
lenItisthemaximumlengthofthebuffer.
flagsItissetto0.

ThesendtoFunction
ThesendtofunctionisusedtosenddataoverUNCONNECTEDdatagramsockets.Itssignatureisasfollows
intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);

Thiscallreturnsthenumberofbytessent,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
msgItisapointertothedatayouwanttosend.
lenItisthelengthofthedatayouwanttosend(inbytes).
flagsItissetto0.
toItisapointertostructsockaddrforthehostwheredatahastobesent.
tolenItissetittosizeof(structsockaddr).

TherecvfromFunction
TherecvfromfunctionisusedtoreceivedatafromUNCONNECTEDdatagramsockets.
intrecvfrom(intsockfd,void*buf,intlen,unsignedintflagsstructsockaddr*from,int*fromlen);

Thiscallreturnsthenumberofbytesreadintothebuffer,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.

https://www.tutorialspoint.com/cgibin/printpage.cgi

15/26

12/11/2016

UnixSocketQuickGuide

bufItisthebuffertoreadtheinformationinto.
lenItisthemaximumlengthofthebuffer.
flagsItissetto0.
fromItisapointertostructsockaddrforthehostwheredatahastoberead.
fromlenItissetittosizeof(structsockaddr).

ThecloseFunction
Theclosefunctionisusedtoclosethecommunicationbetweentheclientandtheserver.Itssyntaxisasfollows
intclose(intsockfd);

Thiscallreturns0onsuccess,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.

TheshutdownFunction
Theshutdownfunctionisusedtogracefullyclosethecommunicationbetweentheclientandtheserver.Thisfunction
givesmorecontrolincomparisontotheclosefunction.Givenbelowisthesyntaxofshutdown
intshutdown(intsockfd,inthow);

Thiscallreturns0onsuccess,otherwiseitreturns1onerror.

Parameters
sockfdItisasocketdescriptorreturnedbythesocketfunction.
howPutoneofthenumbers
0indicatesthatreceivingisnotallowed,
1indicatesthatsendingisnotallowed,and
2indicatesthatbothsendingandreceivingarenotallowed.Whenhowissetto2,it'sthesamethingas
close().

TheselectFunction
Theselectfunctionindicateswhichofthespecifiedfiledescriptorsisreadyforreading,readyforwriting,orhasan
errorconditionpending.
Whenanapplicationcallsrecvorrecvfrom,itisblockeduntildataarrivesforthatsocket.Anapplicationcouldbe
doingotherusefulprocessingwhiletheincomingdatastreamisempty.Anothersituationiswhenanapplication
receivesdatafrommultiplesockets.
Callingrecvorrecvfromonasocketthathasnodatainitsinputqueuepreventsimmediatereceptionofdatafrom
othersockets.Theselectfunctioncallsolvesthisproblembyallowingtheprogramtopollallthesockethandlesto
seeiftheyareavailablefornonblockingreadingandwritingoperations.
Givenbelowisthesyntaxofselect
intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*errorfds,structtimeval*timeout);

Thiscallreturns0onsuccess,otherwiseitreturns1onerror.
https://www.tutorialspoint.com/cgibin/printpage.cgi

16/26

12/11/2016

UnixSocketQuickGuide

Parameters
nfdsItspecifiestherangeoffiledescriptorstobetested.Theselect()functiontestsfiledescriptorsinthe
rangeof0tonfds1
readfdsItpointstoanobjectoftypefd_setthatoninput,specifiesthefiledescriptorstobecheckedforbeing
readytoread,andonoutput,indicateswhichfiledescriptorsarereadytoread.ItcanbeNULLtoindicatean
emptyset.
writefdsItpointstoanobjectoftypefd_setthatoninput,specifiesthefiledescriptorstobecheckedfor
beingreadytowrite,andonoutput,indicateswhichfiledescriptorsarereadytowrite.ItcanbeNULLto
indicateanemptyset.
exceptfdsItpointstoanobjectoftypefd_setthatoninput,specifiesthefiledescriptorstobecheckedfor
errorconditionspending,andonoutputindicates,whichfiledescriptorshaveerrorconditionspending.Itcan
beNULLtoindicateanemptyset.
timeoutItpointstoatimevalstructthatspecifieshowlongtheselectcallshouldpollthedescriptorsforan
availableI/Ooperation.Ifthetimeoutvalueis0,thenselectwillreturnimmediately.Ifthetimeoutargumentis
NULL,thenselectwillblockuntilatleastonefile/sockethandleisreadyforanavailableI/Ooperation.
OtherwiseselectwillreturnaftertheamountoftimeinthetimeouthaselapsedORwhenatleastone
file/socketdescriptorisreadyforanI/Ooperation.
ThereturnvaluefromselectisthenumberofhandlesspecifiedinthefiledescriptorsetsthatarereadyforI/O.Ifthe
timelimitspecifiedbythetimeoutfieldisreached,selectreturn0.Thefollowingmacrosexistformanipulatingafile
descriptorset
FD_CLR(fd,&fdset)Clearsthebitforthefiledescriptorfdinthefiledescriptorsetfdset.
FD_ISSET(fd,&fdset)Returnsanonzerovalueifthebitforthefiledescriptorfdissetinthefiledescriptor
setpointedtobyfdset,and0otherwise.
FD_SET(fd,&fdset)Setsthebitforthefiledescriptorfdinthefiledescriptorsetfdset.
FD_ZERO(&fdset)Initializesthefiledescriptorsetfdsettohavezerobitsforallfiledescriptors.
Thebehaviorofthesemacrosisundefinedifthefdargumentislessthan0orgreaterthanorequaltoFD_SETSIZE.

Example
fd_setfds;
structtimevaltv;
/*dosocketinitializationetc.
tv.tv_sec=1;
tv.tv_usec=500000;
/*tvnowrepresents1.5seconds*/
FD_ZERO(&fds);
/*addssocktothefiledescriptorset*/
FD_SET(sock,&fds);
/*wait1.5secondsforanydatatobereadfromanysinglesocket*/
select(sock+1,&fds,NULL,NULL,&tv);
if(FD_ISSET(sock,&fds)){
recvfrom(s,buffer,buffer_len,0,&sa,&sa_len);
/*dosomething*/
}
else{
/*dosomethingelse*/
}

https://www.tutorialspoint.com/cgibin/printpage.cgi

17/26

12/11/2016

UnixSocketQuickGuide

UnixSocketHelperFunctions
Thischapterdescribesallthehelperfunctions,whichareusedwhiledoingsocketprogramming.Otherhelper
functionsaredescribedinthechaptersPortsandServices,andNetworkByteOrders.

ThewriteFunction
Thewritefunctionattemptstowritenbytebytesfromthebufferpointedbybuftothefileassociatedwiththeopen
filedescriptor,fildes.
Youcanalsousesend()functiontosenddatatoanotherprocess.
#include<unistd.h>
intwrite(intfildes,constvoid*buf,intnbyte);

Uponsuccessfulcompletion,write()returnsthenumberofbytesactuallywrittentothefileassociatedwithfildes.
Thisnumberisnevergreaterthannbyte.Otherwise,1isreturned.

Parameters
fildesItisasocketdescriptorreturnedbythesocketfunction.
bufItisapointertothedatayouwanttosend.
nbyteItisthenumberofbytestobewritten.Ifnbyteis0,write()willreturn0andhavenootherresultsifthe
fileisaregularfileotherwise,theresultsareunspecified.

ThereadFunction
Thereadfunctionattemptstoreadnbytebytesfromthefileassociatedwiththeopenfiledescriptor,fildes,intothe
bufferpointedtobybuf.
Youcanalsouserecv()functiontoreaddatatoanotherprocess.
#include<unistd.h>
intread(intfildes,constvoid*buf,intnbyte);

Uponsuccessfulcompletion,write()returnsthenumberofbytesactuallywrittentothefileassociatedwithfildes.
Thisnumberisnevergreaterthannbyte.Otherwise,1isreturned.

Parameters
fildesItisasocketdescriptorreturnedbythesocketfunction.
bufItisthebuffertoreadtheinformationinto.
nbyteItisthenumberofbytestoread.

TheforkFunction
Theforkfunctioncreatesanewprocess.Thenewprocesscalledthechildprocesswillbeanexactcopyofthecalling
process(parentprocess).Thechildprocessinheritsmanyattributesfromtheparentprocess.
#include<sys/types.h>
#include<unistd.h>
intfork(void);

https://www.tutorialspoint.com/cgibin/printpage.cgi

18/26

12/11/2016

UnixSocketQuickGuide

Uponsuccessfulcompletion,fork()returns0tothechildprocessandtheprocessIDofthechildprocesstotheparent
process.Otherwise1isreturnedtotheparentprocess,nochildprocessiscreatedanderrnoissettoindicatethe
error.

Parameters
voidItmeansnoparameterisrequired.

ThebzeroFunction
Thebzerofunctionplacesnbytenullbytesinthestrings.Thisfunctionisusedtosetallthesocketstructureswith
nullvalues.
voidbzero(void*s,intnbyte);

Thisfunctiondoesnotreturnanything.

Parameters
sItspecifiesthestringwhichhastobefilledwithnullbytes.Thiswillbeapointtosocketstructurevariable.
nbyteItspecifiesthenumberofbytestobefilledwithnullvalues.Thiswillbethesizeofthesocket
structure.

ThebcmpFunction
Thebcmpfunctioncomparesbytestrings1againstbytestrings2.Bothstringsareassumedtobenbytebyteslong.
intbcmp(constvoid*s1,constvoid*s2,intnbyte);

Thisfunctionreturns0ifbothstringsareidentical,1otherwise.Thebcmp()functionalwaysreturns0whennbyteis
0.

Parameters
s1Itspecifiesthefirststringtobecompared.
s2Itspecifiesthesecondstringtobecompared.
nbyteItspecifiesthenumberofbytestobecompared.

ThebcopyFunction
Thebcopyfunctioncopiesnbytebytesfromstrings1tothestrings2.Overlappingstringsarehandledcorrectly.
voidbcopy(constvoid*s1,void*s2,intnbyte);

Thisfunctiondoesnotreturnanything.

Parameters
s1Itspecifiesthesourcestring.
s2vItspecifiesthedestinationstring.
nbyteItspecifiesthenumberofbytestobecopied.

ThememsetFunction
https://www.tutorialspoint.com/cgibin/printpage.cgi

19/26

12/11/2016

UnixSocketQuickGuide

Thememsetfunctionisalsousedtosetstructurevariablesinthesamewayasbzero.Takealookatitssyntax,given
below.
void*memset(void*s,intc,intnbyte);

Thisfunctionreturnsapointertovoidinfact,apointertothesetmemoryandyouneedtocasteitaccordingly.

Parameters
sItspecifiesthesourcetobeset.
cItspecifiesthecharactertosetonnbyteplaces.
nbyteItspecifiesthenumberofbytestobeset.

UnixSocketServerExamples
TomakeaprocessaTCPserver,youneedtofollowthestepsgivenbelow
Createasocketwiththesocket()systemcall.
Bindthesockettoanaddressusingthebind()systemcall.ForaserversocketontheInternet,anaddress
consistsofaportnumberonthehostmachine.
Listenforconnectionswiththelisten()systemcall.
Acceptaconnectionwiththeaccept()systemcall.Thiscalltypicallyblocksuntilaclientconnectswiththe
server.
Sendandreceivedatausingtheread()andwrite()systemcalls.
Nowletusputthesestepsintheformofsourcecode.Putthiscodeintothefileserver.candcompileitwithgcc
compiler.
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<netinet/in.h>
#include<string.h>
intmain(intargc,char*argv[]){
intsockfd,newsockfd,portno,clilen;
charbuffer[256];
structsockaddr_inserv_addr,cli_addr;
intn;

/*Firstcalltosocket()function*/
sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd<0){
perror("ERRORopeningsocket");
exit(1);
}

/*Initializesocketstructure*/
bzero((char*)&serv_addr,sizeof(serv_addr));
portno=5001;

serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(portno);

/*Nowbindthehostaddressusingbind()call.*/
if(bind(sockfd,(structsockaddr*)&serv_addr,sizeof(serv_addr))<0){
perror("ERRORonbinding");
https://www.tutorialspoint.com/cgibin/printpage.cgi

20/26

12/11/2016

UnixSocketQuickGuide

exit(1);
}

/*Nowstartlisteningfortheclients,hereprocesswill
*goinsleepmodeandwillwaitfortheincomingconnection
*/

listen(sockfd,5);
clilen=sizeof(cli_addr);

/*Acceptactualconnectionfromtheclient*/
newsockfd=accept(sockfd,(structsockaddr*)&cli_addr,&clilen);

if(newsockfd<0){
perror("ERRORonaccept");
exit(1);
}

/*Ifconnectionisestablishedthenstartcommunicating*/
bzero(buffer,256);
n=read(newsockfd,buffer,255);

if(n<0){
perror("ERRORreadingfromsocket");
exit(1);
}

printf("Hereisthemessage:%s\n",buffer);

/*Writearesponsetotheclient*/
n=write(newsockfd,"Igotyourmessage",18);

if(n<0){
perror("ERRORwritingtosocket");
exit(1);
}

return0;
}

HandleMultipleConnections
Toallowtheservertohandlemultiplesimultaneousconnections,wemakethefollowingchangesintheabovecode
Puttheacceptstatementandthefollowingcodeinaninfiniteloop.
Afteraconnectionisestablished,callfork()tocreateanewprocess.
Thechildprocesswillclosesockfdandcalldoprocessingfunction,passingthenewsocketfiledescriptorasan
argument.Whenthetwoprocesseshavecompletedtheirconversation,asindicatedbydoprocessing()
returning,thisprocesssimplyexits.
Theparentprocessclosesnewsockfd.Asallofthiscodeisinaninfiniteloop,itwillreturntotheaccept
statementtowaitforthenextconnection.
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<netinet/in.h>
#include<string.h>
voiddoprocessing(intsock);
intmain(intargc,char*argv[]){
intsockfd,newsockfd,portno,clilen;
charbuffer[256];
structsockaddr_inserv_addr,cli_addr;
intn,pid;

https://www.tutorialspoint.com/cgibin/printpage.cgi

21/26

12/11/2016

UnixSocketQuickGuide

/*Firstcalltosocket()function*/
sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd<0){
perror("ERRORopeningsocket");
exit(1);
}

/*Initializesocketstructure*/
bzero((char*)&serv_addr,sizeof(serv_addr));
portno=5001;

serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(portno);

/*Nowbindthehostaddressusingbind()call.*/
if(bind(sockfd,(structsockaddr*)&serv_addr,sizeof(serv_addr))<0){
perror("ERRORonbinding");
exit(1);
}

/*Nowstartlisteningfortheclients,here
*processwillgoinsleepmodeandwillwait
*fortheincomingconnection
*/

listen(sockfd,5);
clilen=sizeof(cli_addr);

while(1){
newsockfd=accept(sockfd,(structsockaddr*)&cli_addr,&clilen);

if(newsockfd<0){
perror("ERRORonaccept");
exit(1);
}

/*Createchildprocess*/
pid=fork();

if(pid<0){
perror("ERRORonfork");
exit(1);
}

if(pid==0){
/*Thisistheclientprocess*/
close(sockfd);
doprocessing(newsockfd);
exit(0);
}
else{
close(newsockfd);
}

}/*endofwhile*/
}

Thefollowingcodeseqmentshowsasimpleimplementationofdoprocessingfunction.
voiddoprocessing(intsock){
intn;
charbuffer[256];
bzero(buffer,256);
n=read(sock,buffer,255);

if(n<0){
perror("ERRORreadingfromsocket");
exit(1);
}

printf("Hereisthemessage:%s\n",buffer);
n=write(sock,"Igotyourmessage",18);
https://www.tutorialspoint.com/cgibin/printpage.cgi

22/26

12/11/2016

UnixSocketQuickGuide

if(n<0){
perror("ERRORwritingtosocket");
exit(1);
}

UnixSocketClientExamples
TomakeaprocessaTCPclient,youneedtofollowthestepsgivenbelow&minus
Createasocketwiththesocket()systemcall.
Connectthesockettotheaddressoftheserverusingtheconnect()systemcall.
Sendandreceivedata.Thereareanumberofwaystodothis,butthesimplestwayistousetheread()and
write()systemcalls.
Nowletusputthesestepsintheformofsourcecode.Putthiscodeintothefileclient.candcompileitwithgcc
compiler.
Runthisprogramandpasshostnameandportnumberoftheserver,toconnecttotheserver,whichyoualreadymust
haveruninanotherUnixwindow.
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<netinet/in.h>
#include<string.h>
intmain(intargc,char*argv[]){
intsockfd,portno,n;
structsockaddr_inserv_addr;
structhostent*server;

charbuffer[256];

if(argc<3){
fprintf(stderr,"usage%shostnameport\n",argv[0]);
exit(0);
}

portno=atoi(argv[2]);

/*Createasocketpoint*/
sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd<0){
perror("ERRORopeningsocket");
exit(1);
}

server=gethostbyname(argv[1]);

if(server==NULL){
fprintf(stderr,"ERROR,nosuchhost\n");
exit(0);
}

bzero((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
bcopy((char*)server>h_addr,(char*)&serv_addr.sin_addr.s_addr,server>h_length);
serv_addr.sin_port=htons(portno);

/*Nowconnecttotheserver*/
if(connect(sockfd,(structsockaddr*)&serv_addr,sizeof(serv_addr))<0){
perror("ERRORconnecting");
https://www.tutorialspoint.com/cgibin/printpage.cgi

23/26

12/11/2016

UnixSocketQuickGuide

exit(1);
}

/*Nowaskforamessagefromtheuser,thismessage
*willbereadbyserver
*/

printf("Pleaseenterthemessage:");
bzero(buffer,256);
fgets(buffer,255,stdin);

/*Sendmessagetotheserver*/
n=write(sockfd,buffer,strlen(buffer));

if(n<0){
perror("ERRORwritingtosocket");
exit(1);
}

/*Nowreadserverresponse*/
bzero(buffer,256);
n=read(sockfd,buffer,255);

if(n<0){
perror("ERRORreadingfromsocket");
exit(1);
}

printf("%s\n",buffer);
return0;
}

UnixSocketSummary
Hereisalistofallthefunctionsrelatedtosocketprogramming.

PortandServiceFunctions
Unixprovidesthefollowingfunctionstofetchservicenamefromthe/etc/servicesfile.
structservent*getservbyname(char*name,char*proto)Thiscalltakesaservicenameandaprotocol
nameandreturnsthecorrespondingportnumberforthatservice.
structservent*getservbyport(intport,char*proto)Thiscalltakesaportnumberandaprotocolnameand
returnsthecorrespondingservicename.

ByteOrderingFunctions
unsignedshorthtons(unsignedshorthostshort)Thisfunctionconverts16bit(2byte)quantitiesfromhost
byteordertonetworkbyteorder.
unsignedlonghtonl(unsignedlonghostlong)Thisfunctionconverts32bit(4byte)quantitiesfromhost
byteordertonetworkbyteorder.
unsignedshortntohs(unsignedshortnetshort)Thisfunctionconverts16bit(2byte)quantitiesfrom
networkbyteordertohostbyteorder.
unsignedlongntohl(unsignedlongnetlong)Thisfunctionconverts32bitquantitiesfromnetworkbyte
ordertohostbyteorder.

IPAddressFunctions
intinet_aton(constchar*strptr,structin_addr*addrptr)Thisfunctioncallconvertsthespecifiedstring,
intheInternetstandarddotnotation,toanetworkaddress,andstorestheaddressinthestructureprovided.The
https://www.tutorialspoint.com/cgibin/printpage.cgi

24/26

12/11/2016

UnixSocketQuickGuide

convertedaddresswillbeinNetworkByteOrder(bytesorderedfromlefttoright).Itreturns1ifthestringis
validand0onerror.
in_addr_tinet_addr(constchar*strptr)Thisfunctioncallconvertsthespecifiedstring,intheInternet
standarddotnotation,toanintegervaluesuitableforuseasanInternetaddress.Theconvertedaddresswillbe
inNetworkByteOrder(bytesorderedfromlefttoright).Itreturnsa32bitbinarynetworkbyteorderedIPv4
addressandINADDR_NONEonerror.
char*inet_ntoa(structin_addrinaddr)ThisfunctioncallconvertsthespecifiedInternethostaddresstoa
stringintheInternetstandarddotnotation.

SocketCoreFunctions
intsocket(intfamily,inttype,intprotocol)Thiscallreturnsasocketdescriptorthatyoucanuseinlater
systemcallsoritgivesyou1onerror.
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)TheconnectfunctionisusedbyaTCP
clienttoestablishaconnectionwithaTCPserver.Thiscallreturns0ifitsuccessfullyconnectstotheserver,
otherwiseitreturns1.
intbind(intsockfd,structsockaddr*my_addr,intaddrlen)Thebindfunctionassignsalocalprotocol
addresstoasocket.Thiscallreturns0ifitsuccessfullybindstotheaddress,otherwiseitreturns1.
intlisten(intsockfd,intbacklog)ThelistenfunctioniscalledonlybyaTCPservertolistenfortheclient
request.Thiscallreturns0onsuccess,otherwiseitreturns1.
intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen)Theacceptfunctioniscalledbya
TCPservertoacceptclientrequestsandtoestablishactualconnection.Thiscallreturnsanonnegative
descriptoronsuccess,otherwiseitreturns1.
intsend(intsockfd,constvoid*msg,intlen,intflags)Thesendfunctionisusedtosenddataoverstream
socketsorCONNECTEDdatagramsockets.Thiscallreturnsthenumberofbytessentout,otherwiseitreturns
1.
intrecv(intsockfd,void*buf,intlen,unsignedintflags)Therecvfunctionisusedtoreceivedataover
streamsocketsorCONNECTEDdatagramsockets.Thiscallreturnsthenumberofbytesreadintothebuffer,
otherwiseitreturns1onerror.
intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen)
ThesendtofunctionisusedtosenddataoverUNCONNECTEDdatagramsockets.Thiscallreturnsthenumber
ofbytessent,otherwiseitreturns1onerror.
intrecvfrom(intsockfd,void*buf,intlen,unsignedintflagsstructsockaddr*from,int*fromlen)The
recvfromfunctionisusedtoreceivedatafromUNCONNECTEDdatagramsockets.Thiscallreturnsthe
numberofbytesreadintothebuffer,otherwiseitreturns1onerror.
intclose(intsockfd)Theclosefunctionisusedtocloseacommunicationbetweentheclientandtheserver.
Thiscallreturns0onsuccess,otherwiseitreturns1.
intshutdown(intsockfd,inthow)Theshutdownfunctionisusedtogracefullycloseacommunication
betweentheclientandtheserver.Thisfunctiongivesmorecontrolincomparisontoclosefunction.Itreturns0
onsuccess,1otherwise.
intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*errorfds,structtimeval*timeout)This
functionisusedtoreadorwritemultiplesockets.

SocketHelperFunctions
intwrite(intfildes,constvoid*buf,intnbyte)Thewritefunctionattemptstowritenbytebytesfromthe
bufferpointedtobybuftothefileassociatedwiththeopenfiledescriptor,fildes.Uponsuccessfulcompletion,
write()returnsthenumberofbytesactuallywrittentothefileassociatedwithfildes.Thisnumberisnever
greaterthannbyte.Otherwise,1isreturned.
https://www.tutorialspoint.com/cgibin/printpage.cgi

25/26

12/11/2016

UnixSocketQuickGuide

intread(intfildes,constvoid*buf,intnbyte)Thereadfunctionattemptstoreadnbytebytesfromthefile
associatedwiththeopenfiledescriptor,fildes,intothebufferpointedtobybuf.Uponsuccessfulcompletion,
write()returnsthenumberofbytesactuallywrittentothefileassociatedwithfildes.Thisnumberisnever
greaterthannbyte.Otherwise,1isreturned.
intfork(void)Theforkfunctioncreatesanewprocess.Thenewprocess,calledthechildprocess,willbean
exactcopyofthecallingprocess(parentprocess).
voidbzero(void*s,intnbyte)Thebzerofunctionplacesnbytenullbytesinthestrings.Thisfunctionwill
beusedtosetallthesocketstructureswithnullvalues.
intbcmp(constvoid*s1,constvoid*s2,intnbyte)Thebcmpfunctioncomparesthebytestrings1against
thebytestrings2.Boththestringsareassumedtobenbytebyteslong.
voidbcopy(constvoid*s1,void*s2,intnbyte)Thebcopyfunctioncopiesnbytebytesfromthestrings1to
thestrings2.Overlappingstringsarehandledcorrectly.
void*memset(void*s,intc,intnbyte)Thememsetfunctionisalsousedtosetstructurevariablesinthe
samewayasbzero.

https://www.tutorialspoint.com/cgibin/printpage.cgi

26/26

You might also like