《Linux下Socket编程.docx》由会员分享,可在线阅读,更多相关《Linux下Socket编程.docx(36页珍藏版)》请在优知文库上搜索。
1、端以及面对连接SOCkel的服务端通过调用bind函数来配践本地信息。Bind函数将SOCket及本机上的一个端口相关联,随后你就可以在该端口监听服务恳求。Bind函数原型为:inibind(intsockd,structsockaddr*myaddr,intUddrIen);Sockfd是调用SOCket函数返回的SOCkel描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针:addrlen常被设置为sizeof(structSOCkaddr)OstructSOCkaddr结构类型是用来保存SoCket信息的:structsockaddrunsign
2、edshortsa_famiIy:*地址族,FXXX*/charsa-data14:*14字节的协议地址*/):safamily一般为AFINET,代表Internet(TCP/IP)地址族:Sadalu则包含该SOCkel的IP地址和端口号。另外还有种结构类型:structSOCkaddJinshortintsinamiIy;/地址族*/unsignedshortintsin_port;/端口号*/structin_addrsin_addr:*IP地址*/unsignedcharsin-zero8;*填充0以保持及StrUCtSoCkaddr同样大小/;这个结构更便利运用。Sin_Zero用
3、来将SoCkaddrin结构填充到及StrUCtSoCkaddr同样的长度,可以用bzerc。或memset()函数将其置为零.指向SOCkaddrin的指针和指向SoCkUddr的指针可以相互转换,这意味若假如一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddrin的指针转换为指向sockaddr的指针:或者相反。运用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获得一个没有被占用的端口号:my_addr.sin_port-0;/*系统随机选择一个未被运用的端口号*/my_addr.sin_addr.s_addr=1NADDR_ANY:*
4、填入本机IP地址*/通过将my_addr.Sin_POrt置为0,函数会自动为你选择一个未占用的湍口来运用.同样,通过将myaddr.sinaddr.saddr置为INADDRANY,系统会自动城入本机IP地址。用意在运用bind函数是须要将sin_port和Sin_addr转换成为网络字节优先依次;而sinaddr则不须要转换。计算机数据存储有两种字节优先依次:高位字节优先和低位字节优先。Internet上数据以高位字节优先依次在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就须要进行转换,否则就会出现数据不一样。下面是儿个字节依次转换函数: h
5、tonlO:把32位值从主机字节序转换成网络字节序 hlons():把16位值从主机字节序转换成网络字节序ntohl():把32位值从网络字节序转换成主机字节序 ntohs():把16位值从网络字节序转换成主机字节序Bindo函数在胜利被调用时返回0:出现错误时返回并将”皿。置为相应的错误号。须要留意的是,在调用bind函数时一般不要将端口号置.为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。连接建立面对连接的客户程序运用Connect函数来配置socket并及远端服务器建立一个TCP连接,其函数原型为:intconnect(intsoc
6、kfd,structsockaddr*servaddr,intaddrlen);Sockfd是socket函数返回的SoCket描述符:serv_addr是包含远端主机IP地址和端口号的指针:addrlen是远端地质结构的长度。Connect函数在出现错误时返回T,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind。,因为这种状况下只需知道目的机器的IP地址,而客户通过哪个湍口及服务器建立连接并不须要关切,SOCket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到打断口。Connect函数启动和远端主机的干脆连接。只有面对连接的客户程序运用socke
7、t时才须要将此SoCket及远端主机相连。无连接协议从不建立干脆连接.面对连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的恳求。1.isten函数使SOCket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务恳求保存在此队列中,直到程序处理它们。int1isten(intsockfd,intbacklog);Sockfd是Socket系统调用返回的socket描述符:backlog指定在恳求队列中允许的最大恳求数,进入的连接恳求将在队列中等待accept。它们(参考下文).BaCkIOg对队列中等待服务的恳求的数目进行了限制,大多数系统缺省值为20。假如
8、一个服务恳求到来时,输入队列已满,该SOCket将拒绝连接恳求,客户将收到一个出错信息。当出现错误时IiStCn函数返回-1,并置相应的erno错误码。accept。函数让服务器接收客户的连接恳求.在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接恳求。intaccept(intsockfd,void*addr,int*addrlen):sockfd是被监听的socket描述符,addr通常是一个指向SOCkaddrJn变量的指针,该变砥用来存放提出连接恳求服务的主机的信息(某台主机从某个端口发出该恳求):addrlen通常为一个指向值为SiZeOf(StrUCtSoC
9、kaddr_in)的整型指针变量。出现错误时accept函数返回T并置相应的errno值。首先,当accept函数监视的SOCkel收到连接恳求时,socket执行体将建立一个新的socket,执行体招这个新socket和恳求连接进程的地址联系起来,收到服务恳求的初始socket仍可以接着在以前的SOCket上监听,同时可以在新的socket描述符上进行数据传输操作。数据传输SendO和recv()这两个函数用丁面对连接的socket上进行数据传输“Sendo函数原型为:intsend(intsockfd,constvoid*msg,intIen1intflags);SoCkfd是你想用来传输
10、数据的SOCkCt描述符:msg是个指向要发送数据的指针:1.en是以字节为单位的数据的长度:门ags一般状况下置为0(关丁该参数的用法可参照man手册).Sendo函数返回事实上发送出的字节数,可能会少于你希望发送的数据。在程序中应当将Sendo的返回值及欲发送的字节数进行比较。当Sendo返回值及Ien不兀配时,应当对这种状况进行处理。char*nsg=Hello!”;inilen,bytessent;Icn=Strlen(msg);bytes_sent-send(sockfd,msg,len,0):recv()函数原至为:intrecv(intsockfd,void*buf,intIcn
11、1unsignedintflags);SoCkfd是接受数据的SoCkCt描述符:buf是存放接收数据的缓冲区:Icn是缓冲的长度.FIatJS也被置为0。ReCvo返回事实上接收的字节数,当出现错误时,返回T并置相应的errn。值。SendtoO和recvfrom用于在无连接的数据报socket方式下进行数据传输。由于本地socket并没有及远端机器建立连接,所以在发送数据时应指明目的地址。SendlOo函数原型为:intsendto(intsockfdlconstvoid*msg,intIen1unsignedintflags,conststructsockaddr+to,inttolen
12、);该函数比Sendo函数多了两个参数,t。表示日地机的IP地址和端口号信息,而t。Ien经常被赋值为Sizeof(slruclsockuddr).Sendto函数也返回实际发送的数据字节长度或在出现发送错误时返回7。RecvfromO函数原型为:intrecvfrom(intsockfd,void*buf,intIon,unsignedintflags,structsockaddrfrom,int*fromlen);from是一个StrUCtSOCkaddr类型的变量,该变量保存源机的IP地址及端口号。fromIen常置为sizeof(structsockaddr).当recrom()返回时
13、,Cromlen包含实际存入from中的数据字节数。RecvfromO函数返回接收到的字节数或当出现错误时返回T,并置相应的ecn。假如你时数据报socket调用fconnect()函数时,你也可以利用send()和recv()进行数据传输,但该SoCkel仍旧是数据报SoCkeI,并且利用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。结束传输当全部的数据操作结束以后,你可以调用ClOSeO函数来释放该SOCke3从而停止在该socket上的任何数据操作:close(sockfd):你也可以调用ShUtdOWn()函数来关闭该sockets该函数允许你只停止在
14、某个方向上的数据传输,而一个方向上的数据传输接着进行.如你可以关闭某SOCket的写操作而允许接着在该SoCkel上接受数据,直至读入全部数据。intshutdown(intsockfd,inthow):SOCkfd是须要关闭的SoCkCt的描述符。参数h。W允许为ShUtdoWn操作选择以下几种方式: O不允许接着接收数据 1不允许接着发送数据 2不允许接着发送和接收数据, 均为允许则调用CloSO()ShIHdCmn在操作胜利时返回0,在出现错误时返回-1并置相应errn。Socket编程实例代码实例中的服务器通过socket连接向客户端发送字符串Hello,youareconnected
15、!”。只要在服务器上运行该服务器软件,在客户端运行客户软件,客户端就会收到该字符串该服务器软件代码如下:SincludeJfinclude件include#includeSincludeSinclude件include#includeWefineSERVPORT3333*服务器监听端口号*/defineBACKl.OG10/*最大同时连接恳求数*/main()(intsockfd,client_fd;/*sock_fd:监听SoCket;CIient_fd:数据传输SoCket/structSoCkaddJinmyaddr;/*本机地址信息*/structSoCkaddJinremoteaddr;/*客户端地址信息*/if(SoCkfd=SockelSF-JNET,SOCKSTREAM,0)=-1)PerrOrrSOCket创建出错!);exit(I);my_addr.sin_family=AF_INET:myaddr.sinporl=htons(SERVIX)RT);myaddr.sin-addr.s_addr=INDDRANY:bzero(myaddr.sin_zero),8):if(bind(sockfd,(structsockaddr*)&my_addr,sizo