Linux下的Socket网络编程:一个简易聊天室的实现-徐慧军

合集下载

socket编程聊天室基本流程

socket编程聊天室基本流程

socket编程聊天室基本流程一、引言Socket编程是一种用于网络通信的编程技术。

它允许程序员创建客户端和服务器应用程序,这些应用程序可以在不同的计算机上运行并通过Internet或局域网相互通信。

在本文中,我们将介绍Socket编程聊天室的基本流程。

二、Socket编程概述Socket编程是一种基于TCP/IP协议的网络编程技术。

它使用套接字(socket)来实现网络通信。

套接字是一种抽象概念,它表示一个网络连接点,可以用来发送和接收数据。

在Socket编程中,客户端和服务器之间建立一个连接,然后通过这个连接进行数据传输。

客户端向服务器发送请求,并等待服务器响应。

服务器接收请求并处理它,并将响应发送回客户端。

三、Socket编程聊天室基本流程1. 创建服务器程序首先,我们需要创建一个服务器程序来监听客户端连接请求。

在Python中,可以使用socket模块来创建套接字对象,并使用bind()方法将其绑定到指定的IP地址和端口号上。

2. 创建客户端程序然后,我们需要创建一个客户端程序来连接到服务器。

同样地,在Python中可以使用socket模块来创建套接字对象,并使用connect()方法连接到指定的IP地址和端口号上。

3. 实现消息传输一旦客户端和服务器之间建立了连接,它们就可以开始进行消息传输。

在Socket编程中,可以使用send()方法将数据发送到对方,使用recv()方法从对方接收数据。

4. 实现聊天室功能为了实现聊天室功能,我们需要让多个客户端能够同时连接到服务器,并且能够相互通信。

为此,我们可以使用多线程或异步编程技术来实现。

在多线程模式下,每个客户端连接都会被分配一个独立的线程来处理。

这个线程负责接收客户端发送的消息,并将其转发给其他客户端。

在异步编程模式下,我们可以使用协程或回调函数来处理消息传输。

当有新的消息到达时,就会触发相应的回调函数进行处理。

5. 实现用户管理为了实现用户管理功能,我们需要让每个客户端都能够注册一个唯一的用户名,并且能够查看当前在线的用户列表。

C#基于Socket实现简单聊天室功能

C#基于Socket实现简单聊天室功能

C#基于Socket实现简单聊天室功能因为这段时间在学习Socket,所以就试着写了⼀个简单的聊天室。

主要分为服务器端和多个客户端。

利⽤服务器端作数据中转站,实现消息群发。

1、服务器端有两个类:using System.Collections.Generic;using ;using .Sockets;namespace 聊天室_Socket_TCP_服务器端{class Program{static List<Client> clients = new List<Client>();static List<Client> notClients = new List<Client>();/// <summary>/// ⼴播消息/// </summary>/// <param name="message"></param>public static void CastMessageTOAllConnetedClients(string message){foreach (var client in clients){if (client.Conneted){client.CastMessage(message);}else{notClients.Add(client);}}foreach (var temp in notClients){clients.Remove(temp);}}static void Main(string[] args){Socket tcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);tcpSever.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.2"), 8899));tcpSever.Listen(100);//监听是否有客户端发起连接Console.WriteLine("Begin to listen...");while (true){Socket clientSocket = tcpSever.Accept();if (clientSocket!=null){Console.WriteLine("A client has connneted...");Client client = new Client(clientSocket);//将每个新创建的连接通信放于client类做通信clients.Add(client);}}Console.ReadKey();}}}using System;using .Sockets;using System.Text;using System.Threading;namespace 聊天室_Socket_TCP_服务器端{/// <summary>/// 利⽤该类和客户端做通信/// </summary>class Client{public Socket clientSocket;private Thread mesManageTherad;private byte[] bufffer=new byte[20];public Client(Socket soc){clientSocket = soc;//由于消息是不断发送的,需要多次进⾏处理。

基于Socket接口的Linux与Windows网络聊天室设计与实现

基于Socket接口的Linux与Windows网络聊天室设计与实现

基于Socket接口的Linux与Windows网络聊天室设计与实现作者:陈洁孟晓景来源:《软件导刊》2015年第06期摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序。

先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信。

整个系统采用客户机/服务器(C/S)模型,Windows客户端采用MFC框架编写,Linux 服务器和客户端均采用C语言实现。

通过测试,Linux和Windows的客户端可以成功连接到服务器,从而实现跨平台网络聊天功能。

关键词:Linux;Windows;套接字;客户机/服务器DOIDOI:10.11907/rjdk.151230中图分类号:TP319文献标识码:A 文章编号:16727800(2015)006009403作者简介作者简介:陈洁(1990-),女,山东菏泽人,山东科技大学信息科学与工程学院硕士研究生,研究方向为计算机网络应用技术;孟晓景(1962-),男,浙江绍兴人,山东科技大学信息科学与工程学院教授,研究方向为计算机网络。

0 引言Linux是一个基于POSIX和UNIX的多任务、多用户、支持多线程的操作系统。

Linux在众多方面表现出强大的优势,通常用在控制领域以提高系统性能。

然而,目前使用最多的Windows操作系统图形界面友好,拥有良好的集成开发环境,操作简单,深受广大用户的喜爱。

两种操作系统各有千秋,越来越多场合同时使用,这就出现了跨平台的通信问题。

对此,本文通过Socket套接口来实现不同操作系统之间的实时聊天,运用C/S模式设计出Windows 与Linux操作系统间可以互相通信的网络聊天室,本客户端可以显示其它客户端的消息,实现了信息的及时共享。

1 Socket编程原理与过程1.1 Socket编程原理Socket[1]作为BSD UNIX的进程通信机制,通常也称作“套接字”,用于描述IP地址和端口,是网络通信的基本单元。

Linux下的网络编程与Socket通信

Linux下的网络编程与Socket通信

Linux下的网络编程与Socket通信在Linux操作系统中,网络编程是一项重要而复杂的技术,而Socket通信则是其中的核心内容。

本文将深入探讨Linux下的网络编程与Socket通信相关的知识和技巧。

一、Linux网络编程概述Linux网络编程指的是在Linux环境下开发网络应用程序的技术。

在Linux系统中,网络编程主要基于Socket套接字实现,通过Socket 套接字,应用程序可以与网络上的其他设备进行通信。

二、Socket通信基础知识1. 什么是Socket?Socket是一种抽象的概念,它提供了一种通信机制,使得不同设备之间可以进行数据传输和通信。

在Linux中,Socket通信是通过套接字(Socket)来实现的。

2. Socket通信的类型Socket通信有两个基本的类型:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

- 流式Socket是一种面向连接的Socket,使用TCP协议,数据传输是可靠和有序的,适用于需要建立可靠连接的数据传输。

- 数据报式Socket是一种无连接的Socket,使用UDP协议,数据传输是不可靠和无序的,适用于对实时性要求较高的数据传输。

三、Linux下的网络编程步骤在Linux下进行网络编程时,我们需要按照以下步骤进行:1. 创建Socket:选择合适的Socket类型,创建一个Socket套接字。

2. 绑定Socket:将Socket与本地地址绑定,以便其他设备可以通过该地址找到它。

3. 监听连接请求(仅适用于流式Socket):对于服务端,需要监听来自客户端的连接请求。

4. 接受连接请求(仅适用于流式Socket):对于服务端,接受客户端的连接请求,建立连接。

5. 连接Socket:对于客户端,连接到服务端的Socket。

6. 发送和接收数据:通过Socket进行数据的发送和接收。

7. 关闭Socket:通信结束后,关闭Socket套接字。

Linux下Socket网络编程

Linux下Socket网络编程

Linux下‎S ocket‎网络编程,文件传输,数据传输的C‎语言例子2010年0‎3月11日星期四 16:15什么是Soc‎k etSocket‎接口是TCP‎/IP网络的A‎P I,Socket‎接口定义了许‎多函数或例程‎,程序员可以用‎它们来开发T‎C P/IP网络上的‎应用程序。

要学Inte‎r net上的‎T CP/IP网络编程‎,必须理解So‎c ket接口‎。

Socket‎接口设计者最‎先是将接口放‎在Unix操‎作系统里面的‎。

如果了解Un‎i x系统的输‎入和输出的话‎,就很容易了解‎S ocket‎了。

网络的 Socket‎数据传输是一‎种特殊的I/O,Socket‎也是一种文件‎描述符。

Socket‎也具有一个类‎似于打开文件‎的函数调用S‎o cket(),该函数返回一个整型的‎S ocket‎描述符,随后的连接建‎立、数据传输等操‎作都是通过该‎S ocket‎实现的。

常用的Soc‎k et类型有‎两种:流式Sock‎e t (SOCK_S‎T REAM)和数据报式S‎o cket(SOCK_D‎G RAM)。

流式是一种面‎向连接的So‎c ket,针对于面向连‎接的TCP服‎务应用;数据报式Sock‎e t是一种无‎连接的Soc‎k et,对应于无连接‎的UDP服务‎应用。

Socket‎建立为了建立So‎c ket,程序可以调用‎S ocket‎函数,该函数返回一‎个类似于文件‎描述符的句柄‎。

socket‎函数原型为:int socket‎(int domain‎, int type, int protoc‎o l);domain‎指明所使用的‎协议族,通常为PF_‎I NET,表示互联网协‎议族(TCP/IP协议族);type参数‎指定sock‎e t的类型: SOCK_S‎T REAM 或SOCK_‎D GRAM,Socket‎接口还定义了‎原始Sock‎e t(SOCK_R‎A W),允许程序使用‎低层协议;protoc‎o l通常赋值‎"0"。

linux下socket编程

linux下socket编程
第二章 socket 编程原理 2.1 问题的引入
UNIX 系统的 I/O 命令集,是从 Maltics 和早期系统中的命令演变出来的,其模式为打 开一读/写一关闭 (open-write-read-close)。在 一个用户进程进行 I/O 操作时,它首 先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述 用户在打开的文件或设备上进行 I /O 操作的进程。然后这个用户进程多次调用“读/写”以 传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对 象的使用。
2.2.3 客户/服务器模式
在 TCP/IP 网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Cl ient/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的 服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资 源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少 的客户请求服务这一非对等作用。其次,网间进程通信完全是异步 的,相互通信的进程间 既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联 系,为二者的数据交换提供同步,这就是基于客户/ 服务器模式的 TCP/IP。
其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此, 网间进程通信还要解决多重协议的识别问题。
为了解决上述问题,TCP/IP 协议引入了下列几个概念。
端口
网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。
按照 OSI 七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信 能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址 了,还包括可以描述进 程的某种标识符。为此,TCP/IP 协议提出了协议端口(protocol port,简称端口)的概 念,用于标识通信的进程。

python实现简易聊天室(Linux终端)

python实现简易聊天室(Linux终端)

python实现简易聊天室(Linux终端)本⽂实例为⼤家分享了python实现简易聊天室的具体代码,供⼤家参考,具体内容如下群聊聊天室1.功能:类似qq群聊功能1.有⼈进⼊聊天室需要输⼊姓名,姓名不能重复2.有⼈进⼊聊天室,其他⼈会受到通知xxx进⼊聊天室3.⼀个⼈发消息,其他⼈会受到消息xxx:xxxxxxxx4.有⼈退出聊天室,其他⼈也会收到通知xxx退出聊天室5.扩展功能:服务端消息公告,服务端发送消息所有⼈都能收到管理员消息:xxxxxxxx2.确定技术模型1.服务端和客户端服务端处理请求,发送管理员消息客户端执⾏各种功能2.套接字选择:udp套接字3.消息发送模型:转发客户端 ~> 服务端 ~> 其他客户端4.存储⽤户信息:{name:addr}5.处理收发关系:多进程分别处理收发3.注意事项1.设计封装⽅案2.写⼀个功能模块测试⼀个模块3.注意注释的添加#coding =utf-8'''chat roomenv:python3.5exc:socket and forkname:mianmabbemail:****************服务端功能:1.搭建⽹络通信2.处理进⼊聊天室* 接收姓名* 判断是否允许进⼊* 将结果反馈给客户端* 如果不允许则结束,允许则将⽤户插⼊数据结构* 给其他⼈发送通知3.处理聊天* 接收消息,判断消息类型,分为L(输⼊姓名),C(发消息),Q(退出聊天室)* 将消息转发4.处理退出聊天室5.发送管理员消息'''from socket import *from os import *from sys import *user = {} #创建空字典⽤来存储⽤户的昵称和地址#处理登录def do_login(s,name,addr):if name in user: #判断昵称是否已经存在s.sendto('该昵称已被占⽤'.encode(),addr)returnelse: #昵称不存在,则发送约定好的'OK's.sendto(b'OK',addr)#功能:有⼈进⼊聊天室,其他⼈会收到消息msg = '\n 欢迎 %s 进⼊聊天室 '%namefor i in user: #发送该条消息给其他⽤户s.sendto(msg.encode(),user[i])user[name] = addr #将该⽤户插⼊数据结构(字典)#处理聊天def do_chat(s,name,text):msg = '%s : %s'%(name,text) #设置消息显⽰格式for i in user:s.sendto(msg.encode(),user[i])#处理退出def do_quit(s,name):msg = '%s 退出了聊天室'%namefor i in user:if i != name: #给其他⼈发送该⽤户退出的消息s.sendto(msg.encode(),user[i])else: #给该⽤户客户端发送约定好的EXIT让⽗进程退出s.sendto(b'EXIT',user[i])del user[name] #删除字典中该⽤户#处理请求def do_request(s):#循环接受所有客户请求while True:try:data,addr = s.recvfrom(1024)except KeyboardInterrupt: #捕获⽗进程直接退出错误exit('服务端退出!')# print(data.decode())msgList = data.decode().split() #按空格拆分为列表,⽅便索引 if msgList[0] == 'L': #判断消息类型do_login(s,msgList[1],addr)elif msgList[0] == 'C':text = ' '.join(msgList[2:]) #将消息中可能有的空格加回来 do_chat(s,msgList[1],text)elif msgList[0] == 'Q':do_quit(s,msgList[1])def main():s = socket(AF_INET,SOCK_DGRAM)ADDR = ('0.0.0.0',8888)s.bind(ADDR)#创建进程pid = fork()if pid < 0:print('Error')elif pid == 0: #⼦进程⽤来发送管理员消息while True:try:text = input('管理员 : ')except KeyboardInterrupt: #捕获⼦进程直接退出错误exit()msg ='C 管理员 %s'%texts.sendto(msg.encode(),ADDR)else: #⽗进程⽤来处理请求do_request(s)main()客户端功能:'''1.搭建通信2.进⼊聊天室* 输⼊姓名* 发送给服务器* 接收服务器反馈* 不允许则重新输⼊,允许则进⼊聊天室* 创建新的进程⽤于消息收发3.聊天* 循环发送消息消息类型分为L(输⼊姓名),C(发消息),Q(退出聊天室)* 循环接收消息4.退出聊天室5.接受管理员消息'''from socket import *from os import *from sys import *ADDR = ('127.0.0.1',8888) #填写服务端地址#循环发送消息def send_msg(s,name):while True:try:text = input() #客户输⼊要发送的消息except KeyboardInterrupt: #⼦进程防⽌⽤户Ctrl+C直接退出text = 'quit'if text.strip() == 'quit': #规定输⼊quit退出msg = 'Q ' + name #消息类型,姓名s.sendto(msg.encode(),ADDR)exit('您已退出聊天室')else:msg = 'C %s %s'%(name,text) #消息类型,姓名,消息s.sendto(msg.encode(),ADDR)#循环接收信息def recv_msg(s):while True:try:data,addr = s.recvfrom(1024)except KeyboardInterrupt: #⽗进程防⽌⽤户Ctrl+C直接退出exit()if data.decode() =='EXIT': #当⽤户退出,⽆需再收消息,约定EXIT让⽗进程退出 exit() #退出⽗进程print(data.decode())#创建⽹络连接def main():s = socket(AF_INET,SOCK_DGRAM)while True:name = input('请输⼊昵称:') #输⼊姓名if not name:returnmsg = 'L ' +name#发送请求s.sendto(msg.encode(),ADDR)#等待回复data,addr = s.recvfrom(1024)if data.decode() == 'OK':print('您已进⼊聊天室')breakelse: #登录失败print(data.decode()) #直接打印服务端的错误信息#创建进程pid = fork()if pid < 0:print('Error')elif pid == 0: #⼦进程发消息send_msg(s,name)else: #⽗进程收消息recv_msg(s)main()先运⾏服务端,再运⾏客户端以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

基于Linux的socket网络编程聊天工具课程设计

基于Linux的socket网络编程聊天工具课程设计

*****《软件综合开发案例教程》课程设计报告课程设计题目小组成员:**,**,**,**任课讲师和助教:**,**2014年 10 月 29 日摘要这个课程设计整体采用在linux平台下,在同一局域网内实现聊天功能。

整体框架主要分为服务端和客户端两个部分,设置好ip和端口号,在Linux下编译和调试两主大块程序,实现服务端和客户端的连接,然后以服务端作为中继转实现客户端之间的通信。

使用socket网络编程采用TCP/IP协议保证连接可靠,并在项目管理中采用linux流行的gcc和makefile编译,提高了编译和调试效率,加快了项目的完成速度。

本次设计的聊天工具采用字符串命令行的方式进行通信,主要实现了五个功能:用户之间一对一的聊天、编辑、换行、用户之间聊天记录保存、聊天记录调取。

经过测试,程序运行可靠,能满足在linux中实现网络聊天的要求。

关键词 linux,socket,gedit,服务端,客户端,网络编程AbstractThe course design of the overall use in the Linux platform, within the same LAN chat functions.Overall framework consists of server and client two parts, set up IP and port number, two main large program under Linux compiling and debugging, to connect server and client, and then turn to the server as a relay to realize the communication between the e the socket network programming using TCP/IP protocol to ensure reliable connect, and using Linux popular GCC in project management and compile a makefile, improve the efficiency of the compiling and debugging, to speed up the completion of the project.The design way of chat tool USES the string on the command line to communicate, has realized the five main functions: the one-on-one chat between users, editing, line feeds, chat records, chat records obtained between users.After testing, the program runs, reliable and can meet the requirements of the implementation in the Linux network chat. Keywords Linux, socket, gedit, server, client, network programming目录摘要 (II)Abstract (II)第一章绪论.......................................................................................... - 1 -1.1、背景......................................................................................... - 1 -1.2、网络聊天的发展状况 ............................................................ - 1 -1.3、Linux系统............................................................................ - 2 -1.3.1 、Linux的简介............................................................... - 2 -1.3.2 、Linux发展历程........................................................... - 3 - 第二章系统应用技术 ......................................................................... - 4 -2.1 、socket概念及功能 ............................................................... - 4 -2.2、socket类型 ........................................................................... - 5 -2.3 、socket函数 ........................................................................... - 5 -2.3.1 、API功能介绍.............................................................. - 5 -2.3.2、套接口地址结构 ........................................................... - 7 -2.3.3、基本转换函数 ............................................................... - 8 -2.3.4、socket编程流程 ............................................................ - 8 -2.4、TCP/IP 协议......................................................................... - 10 -2.4.1、协议概述 ..................................................................... - 10 -2.4.2、TCP/IP层次结构 ........................................................ - 10 - 第三章需求分析 ............................................................................... - 13 -3.1 、功能需求 ............................................................................ - 13 -3.2、性能需求 .............................................................................. - 13 -3.3 、模块划分 ............................................................................ - 13 -3.3.1、界面需求设计 ........................................................... - 14 -3.3.2 、通信需求 ................................................................... - 14 -3.3.3 、数据存储 ................................................................... - 14 -3.4、系统总流程图 ...................................................................... - 14 - 第四章系统测试 ............................................................................... - 15 -4.1、测试说明 .............................................................................. - 15 -4.2、模块测试 .............................................................................. - 15 -4.3、测试结果分析 ...................................................................... - 16 - 第五章设计和实现 ........................................................................... - 16 -5.1、窗体的设计 .......................................................................... - 16 -5.2、实现服务器与客户端的连接 .............................................. - 17 -5.3、聊天功能 .............................................................................. - 18 -5.4、编辑功能的实现 .................................................................. - 19 -5.5、换行功能的实现 .................................................................. - 20 -5.6、数据库的创建与连接 .......................................................... - 21 -5.6.1、MySQL数据库的简介 ............................................... - 21 -5.6.2、MYSQL环境搭建 ...................................................... - 21 -5.7 、显示聊天记录 .................................................................... - 23 -结论................................................................................................ - 25 - 致谢................................................................................................ - 26 -第一章绪论1.1、背景随着Internet的快速发展和普及,网络已经遍布世界各个角落。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux下的Socket网络编程:一个简易聊天室的实现-徐慧军
高级程序设计与应用实践
报告
一个简易聊天室的实现
姓名:徐慧军
学号:2121134
专业:电子与通信工程
学院:信息科学与技术学院
任课教师:廖晓飞
2013年05月02日
Linux下的Socket网络编程:
——一个简易聊天室的实现一、socket介绍
socket接口是TCP/IP网络的API,socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。

要学Internet上的TCP/IP 网络编程,必须理解socket接口。

socket接口设计者最先是将接口放在Unix操作系统里面的。

如果了解Unix 系统的输入和输出的话,就很容易了解socket了。

网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。

socket也具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。

常用的socket类型有两种:流式socket (SOCK_STREAM)和数据报式socket(SOCK_DGRAM)。

流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接的socket,对应于无连接的UDP服务应用。

二、Socket创建
socket函数原型为:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:调用成功,返回socket文件描述符;失败,返回-1,并设置errno 参数说明:
domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP 协议族;
type参数指定socket的类型:
SOCK_STREAM 提供有序、可靠、双向及基于连接的字节流
SOCK_DGRAM 支持数据报
SOCK_SEQPACKET 提供有序、可靠、双向及基于连接的数据报通信
SOCK_RAW 提供对原始网络协议的访问
SOCK_RDM 提供可靠的数据报层,但是不保证有序性
protocol通常赋值"0".
socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用socket函数时,socket执行体将建立一个socket,实际上"建立一个socket"意味着为一个socket数据结构分配存储空间。

socket执行体为你管理描述符表。

两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。

socket数据结构中包含这五种信息。

三、Socket邦定
bind函数原型为:
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sock_fd,struct sockaddr *my_addr, int addrlen);
功能说明:将套接字和指定的端口相连。

成功返回0,否则,返回-1,并置errno.
参数说明:sock_fd是调用socket函数返回的socket描述符,
my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;
addrlen常被设置为sizeof(struct sockaddr)。

struct sockaddr结构类型是用来保存socket信息的:
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;
sa_data则包含该socket的IP地址和端口号。

另外还有一种结构类型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
};
这个结构更方便使用。

sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。

指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:
my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */
通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。

同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。

注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序。

计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先(大端和小端)。

Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。

相关文档
最新文档