实验七:Linux Socket编程 实验报告

合集下载

linux socket编程案例

linux socket编程案例

linux socket编程案例如何使用Linux Socket编程案例实现网络通信?一、介绍Socket编程是Linux操作系统中用于实现网络通信的一种编程接口。

通过Socket编程,我们可以在不同的主机之间建立网络连接,并进行数据传输。

本文将通过一个案例,一步一步介绍如何使用Linux Socket编程实现一个简单的网络通信应用。

二、准备工作在开始编写Socket程序之前,我们需要确保已经安装了Linux操作系统,并且具备一定的编程基础。

以下是本文案例所使用的环境和工具:- 操作系统:Ubuntu 20.04 LTS- 编程语言:C++- 编译器:g++三、案例背景我们打算实现一个简单的客户端-服务器模型。

客户端将向服务器发送一段文本,并在服务器端进行反转后返回给客户端。

四、服务器端代码实现1. 首先,我们创建一个服务器端的Socket,用于接收客户端连接:cpp#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int main() {创建Socketint serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}设置监听地址struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8888);serverAddress.sin_addr.s_addr = INADDR_ANY;绑定Socket和地址if (bind(serverSocket, (struct sockaddr*)&serverAddress,sizeof(serverAddress)) == -1) {std::cerr << "Failed to bind socket." << std::endl;return -1;}开始监听if (listen(serverSocket, 5) == -1) {std::cerr << "Failed to listen on socket." << std::endl;return -1;}std::cout << "Server started, listening on port 8888." << std::endl;接受客户端连接struct sockaddr_in clientAddress;socklen_t clientAddressLength = sizeof(clientAddress);int clientSocket = accept(serverSocket, (structsockaddr*)&clientAddress, &clientAddressLength);处理客户端请求...关闭Socketclose(serverSocket);return 0;}以上代码中,我们先创建一个Socket对象,然后设置服务器的监听地址,接着绑定Socket和地址,最后开始监听客户端连接。

socket编程实验报告

socket编程实验报告

socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它允许不同的计算机之间进行数据交换和通信。

通过实验,我们可以更深入地了解Socket编程的原理和应用。

实验目的:1. 了解Socket编程的基本原理和概念2. 掌握Socket编程的基本操作和使用方法3. 实现简单的客户端和服务器端通信实验环境:1. 操作系统:Windows或Linux2. 编程语言:C/C++或Python实验步骤:1. 理解Socket编程的基本原理和概念,包括TCP和UDP协议2. 编写客户端程序,建立与服务器端的连接3. 编写服务器端程序,接受客户端的连接并进行数据交换4. 测试客户端和服务器端的通信功能,包括发送和接收数据实验结果:通过实验,我们成功实现了简单的客户端和服务器端通信。

我们能够在客户端发送数据,服务器端接收并处理数据,然后再将处理结果返回给客户端。

这证明了Socket编程的可行性和实用性。

实验总结:Socket编程是一种强大而灵活的通信方式,它可以实现不同计算机之间的数据交换和通信。

通过本次实验,我们更加深入地了解了Socket编程的原理和应用,掌握了基本的操作和使用方法。

我们相信在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

通过这次实验,我们对Socket编程有了更深刻的理解,也提升了我们的编程能力和实践能力。

我们相信,在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

Socket编程报告

Socket编程报告

Socket编程报告(TCP/IP协议)一.实验目的通过C++来实现TCP/IP协议下的Socket编程,掌握TCP协议的算法实现。

二.实验原理客户端建立Socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用CloseSocket关闭Socket服务端建立Socket,声明自身的端口号和地址并绑定到Socket,使用Listen打开监听,然后不断用Accept去查看是否有连接,如果有,捕获Socket,并通过Recv获取消息的内容,通信完成后调用CloseSocket关闭这个对应Accept到的Socket,如果不再需要等待任何客户端连接,那么用CloseSocket关闭掉自身的Socket三.实验代码(C++实现)服务器端代码如下:#pragma once#include <stdio.h>#include <winsock.h>#pragma comment (lib,"ws2_32.lib")class CServerNet{public://初始化服务器,返回0表示成功int Init(const char* address,int port);//更新数据void Run();private:SOCKET m_sock;};int CServerNet::Init( const char* address,int port ) {int rlt = 0;//用于记录错误信息,并输出int iErrorMsg;//初始化WinSockWSAData wsaData;iErrorMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrorMsg != NO_ERROR){//初始化WinSock失败printf("wsastartup failed with error : %d\n",iErrorMsg);rlt = 1;return rlt;}//创建服务端Socketm_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (m_sock == INVALID_SOCKET){//创建Socket异常printf("socket failed with error : %d\n",WSAGetLastError());rlt = 2;return rlt;}//声明信息sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = port;serverAddr.sin_addr.s_addr = inet_addr(address);//绑定iErrorMsg = bind(m_sock,(sockaddr*)&serverAddr,sizeof(serverAddr));if (iErrorMsg < 0){//绑定失败printf("bind failed with error : %d\n",iErrorMsg);rlt = 3;return rlt;}return rlt;}void CServerNet::Run(){//公开连接listen(m_sock,5);sockaddr_in tcpAddr;int len = sizeof(sockaddr);SOCKET newSocket;char buf[1024];int rval;do{//接收信息newSocket = accept(m_sock,(sockaddr*)&tcpAddr,&len); if (newSocket == INVALID_SOCKET){//非可用socket}else{//新socket连接printf("new socket connect : %d\n",newSocket);//消息处理do{printf("process\n");//接收数据memset(buf,0,sizeof(buf));rval = recv(newSocket,buf,1024,0);if (rval == SOCKET_ERROR)//这应该是个异常,当客户端没有调用closeSocket 就直接退出游戏的时候,将会进入这里printf("recv socket error\n");if (rval == 0)//recv返回0表示正常退出printf("ending connection");else//显示接收到的数据printf("recv %s\n",buf);}while(rval != 0);//关闭对应Accept的socketclosesocket(newSocket);}} while (1);//关闭自身的Socketclosesocket(m_sock);}int main(int argc, char **argv){CServerNet serverNet;int iRlt = serverNet.Init("127.0.0.1",8888);if (iRlt == 0){printf("init ok...\n");serverNet.Run();}elseprintf("serverNet init failed with error : %d\n",iRlt);system("pause");}客户端代码如下:#pragma once#include <stdio.h>#include<windows.h>#pragma comment(lib, "Ws2_32.lib")class CClientNet{public://连接上指定服务器int Connect(int port,const char* address);//发送信息int SendMsg(const char* msg,int len);//关闭void Close();private:SOCKET m_sock;};int CClientNet::Connect( int port,const char* address ) {int rlt = 0;//用于记录错误信息并输出int iErrMsg;//启动WinSockWSAData wsaData;iErrMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrMsg != NO_ERROR)//有错误{printf("failed with wsaStartup error : %d\n",iErrMsg);rlt = 1;return rlt;}//创建Socketm_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (m_sock == INVALID_SOCKET)//创建Socket失败{printf("socket failed with error : %d\n",WSAGetLastError());rlt = 2;return rlt;}//目标服务器数据sockaddr_in sockaddrServer;sockaddrServer.sin_family = AF_INET;sockaddrServer.sin_port = port;sockaddrServer.sin_addr.s_addr = inet_addr(address);//连接,sock与目标服务器连接iErrMsg = connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrSe rver));if (iErrMsg < 0){printf("connect failed with error : %d\n",iErrMsg);rlt = 3;return rlt;}return rlt;}int CClientNet::SendMsg(const char* msg,int len){int rlt = 0;int iErrMsg = 0;//发送消息,指定sock发送消息iErrMsg = send(m_sock,msg,len,0);if (iErrMsg < 0)//发送失败{printf("send msg failed with error : %d\n",iErrMsg);rlt = 1;return rlt;}return rlt;}void CClientNet::Close(){closesocket(m_sock);}int main(){CClientNet client;//连接到127.0.0.1(即本地),端口号为8888的服务端printf("Connect\n");client.Connect(8888,"127.0.0.1");//发送消息printf("send msg\n");client.SendMsg("hello\0",sizeof("hello\0"));//关闭socketprintf("close\n");client.Close();system("pause");}四.实验结果五.心得体会通过本次实验,我了解了TCP/IP协议与UDP协议的异同之处,理解了Socket在通信中的地位和作用。

linux编程实验报告doc

linux编程实验报告doc

linux编程实验报告篇一:Linux程序设计实验报告《Linux程序设计》实验报告安徽工业大学计算机学院XX年6月1实验一 Linux基本命令的使用1、实验目的学习和掌握Linux的基本命令。

2、实验内容和步骤步骤1:以user_login用户身份并使用telnet登录Linux服务器,按照提示创建自己的账户和口令。

步骤 2:使用新创建的用户账户和口令登录Linux系统,察看登录后的界面。

步骤3:使用pwd命令察看当前的工作目录,然后用ls 命令查看当前目录下的内容,尝试使用-a,-l,-F,-A,-lF等不同选项并比较不同之处。

步骤4:在当前目录下建立一个名为test的新目录,然后将工作目录切换到test下,尝试将/etc目录下的文件passwd拷贝到该目录下(cp 源文件目的目录)。

察看当前目录下的passwd文件的属主和文件权限。

2步骤5:尝试向当前目录下的passwd文件和/etc/passwd 文件分别写入一些新内容(可使用echo “字符串” >>文件的命令),看看操作能否成功,如果不能成功,请说明原因。

用cat命令浏览文件password的内容,用more命令进行浏览翻页操作,再用less命令浏览文件的内容。

比较这几个命令的不同之处步骤6:用ls命令查看test下文件的权限,用mv命令更改文件password的文件名为test.txt,尝试用chown和chgrp更改文件的属主为root、组为root,看看能否成功,不成功,请说明原因。

尝试用chomd将文件权限为“-rw-------”。

看看能否成功,不成功,请说明原因。

3步骤7:用rm命令删除test目录下的所有文件,再用rmdir命令删除test目录。

(想一想有没有一条命令将目录及目录下的所有文件删除,写出这条命令)步骤8:使用ps命令查看当前系统内的进程,并利用man命令获取ps命令的参数,写出获取当前终端进程执行情况的ps命令。

计算机网络socket编程实验报告

计算机网络socket编程实验报告

Socket编程实验报告一、程序代码(1)服务器端#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { return; }if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ){ WSACleanup( );return; }SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口listen(sockSrv,SOMAXCONN); //SOMAXCONN由系统确定请求数SOCKADDR_IN addrClient;// 连接上的客户端ip地址int len=sizeof(SOCKADDR);while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);// 接受客户端连接,获取客户端的ip地址char sendBuf[50];sprintf(sendBuf,"Welcome %s tohere!",inet_ntoa(addrClient.sin_addr));// 组合消息发送出去send(sockConn,sendBuf,strlen(sendBuf)+1,0);// 发送消息到客户端char recvBuf[50]; recv(sockConn,recvBuf,50,0);// 接受客户端消息printf("%s\n",recvBuf);closesocket(sockConn);WSACleanup();//断开连接}}(2)客户端代码#include <stdio.h>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")void main(){WORD wVersionRequested;WSADATA wsaData;//WSAata用来存储系统传回的关于WinSocket的资料。

Socket网络编程实验指导

Socket网络编程实验指导

实验七 Socket网络编程一、学时:4二、实验类型:设计性实验三、实验目的:1.熟悉VisualC++的基本操作。

2.基本了解基于对话框的windows应用程序的编写过程。

3.对于Windows Socket编程建立初步概念。

四、实验内容:利用Socket编写聊天程序。

五、实验原理:一、Windows Socket和套接口的基本概念套接口,就是一个指向传输提供者的句柄。

Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。

Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。

Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。

使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。

此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。

Winsock提供了一种可为指定传输协议打开、计算和关闭会话的能力。

在Windows下,TCP/IP上层模型在很大程度上与用户的Winsock应用有关;换言之,用户的Winsock应用控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。

套接口有三种类型:流式套接口、数据报套接口及原始套接口。

流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。

数据报套接口定义了一种无连接的服务(UDP 协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。

Linux Socket 编程实验

Linux Socket 编程实验

实验6. Linux Socket 编程实验1、实验目的:(1) 了解TCP/IP 协议;(2) 掌握socket 编程。

2、实验设备:(1) PC 机的VMware 虚拟机运行Ubuntu Linux 系统;(2) 两机对连的网络线;(3) 带网口的测试计算机;(4) WINDOWS“SOCKET TOOL”调试工具。

3、实验内容:实现典型客户机/服务器程序中的服务器及客户机。

4、实验原理4.1 客户机/服务器工作流程使用TCP协议的客户机/服务器进程的工作过程如下图4.2 Socket 编程相关函数常用的socket函数有:socket,bind,listen,accept,connect,send,recv。

1)socket(建立连接)表头文件:#include<sys/types.h>#include<sys/socket.h>定义函数:int socket(int family,int type,int protocol);函数说明:socket()函数用来生成一个套接口描述字,也称为套接字,指定协议簇和套接口。

参数:family指定协议族,type指明字节流方式,而protocol一般为0Family的取值范围:AF_LOCALUNIX协议族AF_ROUTE路由套接口AF_INETIPv4协议AF_INET6IPv6协议AF_KEY密钥套接口参数type的取值范围:SOCK_STREAMTCP套接口SOCK_DGRAMUDP套接口SOCK_PACKET支持数据链路访问SOCK_RAM原始套接口返回值:成功返回非负描述字,失败返回负值2)bind(对socket定位)表头文件:#include<sys/types.h>#include<sys/socket.h>定义函数:Int bind(int sockfd,struct sockaddr * my_addr,int addrlen);函数说明bind()用来设置给参数sockfd的socket一个名称。

linux编程 实验报告

linux编程 实验报告

linux编程实验报告Linux编程实验报告一、引言Linux操作系统是一种自由开源的操作系统,具有稳定性、安全性和灵活性等优点,被广泛应用于服务器、嵌入式系统和个人电脑等领域。

本实验旨在通过编程实践,探索Linux编程的基本概念和技术,并通过实验结果验证相关理论。

二、实验目的本实验的主要目的是通过编写C语言程序,理解Linux系统调用的原理和使用方法。

具体目标包括:1. 熟悉Linux系统调用的概念和基本原理;2. 掌握Linux系统调用的常用函数及其使用方法;3. 理解文件操作、进程管理和网络编程等方面的基本知识。

三、实验环境本实验使用的实验环境为Ubuntu 20.04 LTS操作系统。

在该系统上,我们可以使用gcc编译器编译C语言程序,并通过终端执行程序。

四、实验内容1. 文件操作文件操作是Linux编程中的重要内容之一。

通过使用系统调用函数,我们可以实现对文件的读写、创建和删除等操作。

在本实验中,我们编写了一个简单的文件复制程序,实现将一个文件的内容复制到另一个文件中。

2. 进程管理进程是Linux系统中的基本执行单元。

通过创建和管理进程,我们可以实现并发执行和多任务处理等功能。

在本实验中,我们编写了一个简单的多进程程序,实现同时执行多个任务的效果。

3. 网络编程网络编程是Linux编程中的一个重要领域,它涉及到网络通信、套接字编程和网络协议等内容。

在本实验中,我们编写了一个简单的客户端-服务器程序,实现了基于TCP协议的网络通信。

五、实验结果与分析通过实验,我们成功编写了文件复制程序、多进程程序和客户端-服务器程序,并在实验环境中运行和测试了这些程序。

实验结果表明,我们对Linux编程的基本概念和技术有了初步的理解和掌握。

在文件复制程序中,我们使用了open、read和write等系统调用函数,实现了将源文件的内容复制到目标文件中。

通过实验测试,我们发现该程序能够正确地复制文件,保持了源文件的内容和结构。

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

《计算机操作系统》实验报告实验七:Linux Socket编程学校:╳╳╳院系:╳╳╳班级:╳╳╳姓名:╳╳╳学号:╳╳╳指导教师:╳╳╳目录一、实验题目 (3)二、实验学时 (3)三、指导老师 (3)四、实验日期 (3)五、实验目的 (3)六、实验原理 (3)6.1 什么是Socket (3)6.2 Socket建立 (3)6.3 Socket配置 (4)6.4 连接建立 (5)6.5 数据传输 (6)6.6 结束传输 (7)七、实验步骤及结果 (7)7.1 编译服务端(server.c) (7)7.2 编译客户端(client.c) (8)7.3 服务端与客户端交互 (8)八、报告书写人 (9)附录一服务端(server.c) (9)附录二客户端(client.c) (11)实验七:Linux Socket编程一、实验题目Linux Socket编程二、实验学时3学时三、指导老师╳╳╳四、实验日期2018年12月17日星期一五、实验目的(1)了解socket含义(2)设计socket程序,实现远程服务器端和客户端的通信六、实验原理6.1 什么是SocketSocket接口是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服务应用。

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

socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP 协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket 接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0"。

Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

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

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

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

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

6.3 Socket配置通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。

面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。

无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。

Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。

Bind函数原型为:int bind(int sockfd,struct sockaddr *my_addr, int addrlen);Sockfd是调用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转换成为网络字节优先顺序;而sin_addr则不需要转换。

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

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

下面是几个字节顺序转换函数:·htonl():把32位值从主机字节序转换成网络字节序·htons():把16位值从主机字节序转换成网络字节序·ntohl():把32位值从网络字节序转换成主机字节序·ntohs():把16位值从网络字节序转换成主机字节序Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。

需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。

6.4 连接建立面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:int connect(int sockfd, struct sockaddr *serv_addr,int addrlen); Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。

Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。

进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到打断口。

Connect函数启动和远端主机的直接连接。

只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。

无连接协议从不建立直接连接。

面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。

Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。

int listen(int sockfd, int backlog);Sockfd是Socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们(参考下文)。

Backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。

如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。

当出现错误时listen函数返回-1,并置相应的errno错误码。

accept()函数让服务器接收客户的连接请求。

在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。

int accept(int sockfd, void *addr, int *addrlen);sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。

出现错误时accept函数返回-1并置相应的errno值。

首先,当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的 socket上监听,同时可以在新的socket描述符上进行数据传输操作。

6.5 数据传输Send()和recv()这两个函数用于面向连接的socket上进行数据传输。

Send()函数原型为:int send(int sockfd, const void *msg, int len, int flags);Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。

相关文档
最新文档