实现socket通信

合集下载

python3利用Socket实现通信

python3利用Socket实现通信

python3利用Socket实现通信Python中的`socket`模块提供了一种用于网络编程的底层接口,可以通过创建套接字来实现通信。

这里介绍了Python3中如何使用Socket 实现通信,包括创建服务器和客户端。

##1.创建服务器服务器负责监听并接受来自客户端的连接请求。

以下是创建服务器的步骤:1. 导入socket模块:`import socket`2. 创建一个TCP套接字:`server_socket =socket.socket(socket.AF_INET, socket.SOCK_STREAM)``AF_INET`指定使用IPV4协议,`SOCK_STREAM`指定使用TCP协议,这样可以建立可靠的连接。

3. 绑定IP地址和端口:`server_socket.bind(('localhost', 8888))`将服务器套接字绑定到指定的IP地址和端口。

可以使用`localhost`表示本机IP地址。

4. 监听连接请求:`server_socket.listen(1)`服务器开始监听连接请求,参数`1`表示最多允许1个待连接请求排队。

5. 接受连接请求并建立连接:`client_socket, client_address = server_socket.accept(``accept(`方法返回一个新的套接字`client_socket`,表示与客户端建立的连接。

`client_address`是一个元组,包含客户端的IP地址和端口。

6. 接收和发送数据:可以使用`client_socket.recv(buffer_size)`从客户端接收数据,使用`client_socket.send(data)`向客户端发送数据。

7. 关闭连接:`client_socket.close(`和`server_socket.close(`通信结束后,关闭客户端和服务器套接字。

利用socket进行数据通信与传输的步骤

利用socket进行数据通信与传输的步骤

利用socket进行数据通信与传输的步骤Socket是计算机之间进行数据传输和通信的标准接口。

利用Socket可以方便地进行网络编程,实现不同设备之间的数据交换和传输。

下面将介绍Socket进行数据通信和传输的步骤,以及一些注意事项。

1. 创建Socket连接首先,需要在客户端和服务器端分别创建Socket连接。

在客户端,可以使用socket.connect()方法;在服务器端,可以使用socket.bind()方法。

这些方法都需要指定IP地址和端口号,以确保连接成功。

2. 发送数据一旦连接成功,就可以开始发送数据。

在Python中,可以使用socket.send()方法发送数据。

这个方法需要传入一个字符串参数,表示要发送的数据。

如果要发送二进制数据,则需要使用socket.sendall()方法。

这个方法需要传入一个字节串参数。

3. 接收数据一旦数据发送成功,服务器端就可以接收到这些数据。

在Python 中,可以使用socket.recv()方法接收数据。

这个方法需要传入一个整数参数,表示要接收的数据大小。

如果数据不足这个大小,则该方法会阻塞,等待更多数据到达。

4. 处理数据一旦接收到数据,就需要对这些数据进行处理。

这通常包括解析数据、验证数据、存储数据等操作,以确保数据的正确性和完整性。

5. 关闭连接最后,需要在客户端和服务器端分别关闭Socket连接。

在Python 中,可以使用socket.close()方法关闭连接。

这个方法不需要传入任何参数,只需要调用即可。

在进行Socket编程时,还需要注意一些事项。

比如,需要指定协议类型(如TCP或UDP)、设置超时时间、处理异常等。

此外,还需要考虑数据安全性和加密性等问题,以确保数据在传输过程中不会被恶意攻击者窃取或篡改。

总之,Socket编程是实现计算机间数据通信和传输的重要方法,可以应用于各种场景,如互联网、物联网、机器人等领域。

在使用Socket时,需要严格遵循以上步骤和注意事项,以确保数据的正确传输和保密性。

socket通信协议

socket通信协议

socket通信协议Socket通信协议。

Socket通信协议是计算机网络中的一种通信机制,它允许不同的计算机之间进行数据交换和通信。

在网络编程中,Socket通常被用于实现客户端和服务器之间的通信。

本文将介绍Socket通信协议的基本原理、使用方法和一些常见的应用场景。

一、基本原理。

Socket通信协议是基于TCP/IP协议栈的一种通信机制,它提供了一种标准的接口,使得不同计算机之间可以进行数据交换。

在Socket通信中,通信的两端分别是客户端和服务器端,它们通过Socket建立连接,并通过Socket进行数据的发送和接收。

在Socket通信中,通信的两端分别拥有一个Socket对象,它们分别被称为套接字。

客户端通过套接字向服务器端发起连接请求,服务器端接受连接请求并创建一个新的套接字来与客户端进行通信。

一旦连接建立,客户端和服务器端就可以通过各自的套接字进行数据的发送和接收。

二、使用方法。

在使用Socket通信时,通常需要进行以下几个步骤:1. 创建Socket对象,在客户端和服务器端分别创建一个Socket对象,用于进行通信。

2. 建立连接,客户端向服务器端发起连接请求,服务器端接受连接请求并创建一个新的套接字来与客户端进行通信。

3. 数据交换,一旦连接建立,客户端和服务器端就可以通过各自的套接字进行数据的发送和接收。

4. 关闭连接,通信结束后,需要关闭套接字并释放相关资源。

三、常见应用场景。

Socket通信协议在计算机网络中有着广泛的应用,常见的应用场景包括但不限于以下几种:1. 网络编程,Socket通信协议是网络编程中的重要组成部分,它为开发者提供了一种标准的接口,使得不同计算机之间可以进行数据交换和通信。

2. 服务器端编程,在服务器端编程中,Socket通信协议被广泛应用于实现服务器和客户端之间的通信,例如Web服务器、邮件服务器等。

3. 客户端编程,在客户端编程中,Socket通信协议同样被广泛应用于实现客户端和服务器之间的通信,例如浏览器、邮件客户端等。

socket通信协议

socket通信协议

socket通信协议Socket通信协议是一种网络通信的基础协议,用于在计算机网络中传输数据。

它可以实现不同计算机之间的数据传输,无论是在本地网络还是互联网上。

Socket通信协议提供了一种简单可靠的数据传输机制,允许应用程序通过网络进行数据的发送和接收。

Socket通信协议的工作原理是建立一个连接,然后在这个连接上进行数据的通信。

通常,一端作为服务器,另一端作为客户端。

服务端等待客户端的连接请求,当有客户端连接到服务端时,双方的Socket对象将建立连接。

连接建立后,双方可以通过发送和接收数据来进行通信。

Socket通信协议可以基于TCP或UDP协议实现。

TCP协议提供了可靠的数据传输机制,确保数据的完整性和顺序,但是相对较慢。

UDP协议则是一种无连接的、不保证数据可靠性的协议,但是传输速度较快。

根据实际需求,可以选择适合的协议来进行数据传输。

在Socket通信协议中,数据的传输是通过Socket对象的send和recv方法来实现的。

send方法用于发送数据,接收端通过recv方法接收数据。

这些方法可以指定数据的大小和协议类型,以便正确地发送和接收数据。

另外,还可以通过setsockopt函数设置参数,来调整Socket的工作方式。

在实际应用中,Socket通信协议广泛应用于各种客户端和服务器之间的通信。

例如,Web浏览器通过Socket协议与Web服务器进行通信,从服务器请求页面并接收响应。

邮件客户端通过SMTP和POP3协议与邮件服务器进行通信,发送和接收电子邮件。

其他各种应用程序,如文件传输和实时通信等,也都使用Socket协议进行数据的传输和通信。

总结来说,Socket通信协议是一种重要的网络通信协议,它提供了可靠的数据传输机制,并广泛应用于各种客户端和服务器之间的通信。

通过使用Socket协议,应用程序可以方便地进行数据的发送和接收,实现不同计算机之间的数据传输。

无论是在本地网络还是互联网上,Socket协议都发挥着重要的作用,为各种应用程序的正常运行提供了基础支持。

C语言实现socket简单通信实例

C语言实现socket简单通信实例

C语⾔实现socket简单通信实例本⽂实例讲述了C语⾔实现socket简单通信的⽅法,分享给⼤家供⼤家参考。

具体实现⽅法如下:服务器端代码如下:/*============================================================================Name : server.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================*/#include <stdlib.h>#include <pthread.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */#include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h>int handle(int point);int main(void) {int sfd, ind;struct sockaddr_in addr;struct sockaddr_in clent;char resv[1024], sendbuf[1024];char buf[1024];char * myaddr = "192.168.231.128";int ret; // 返回值设置socklen_t lent;int pid;addr.sin_family = AF_INET; //IPv4 Internet protocolsaddr.sin_port = htons(5050); //这⾥输⼊服务器端⼝号addr.sin_addr.s_addr = inet_addr(myaddr);; //INADDR_ANY表⽰本机IP//獲取socket描述符,IPV4asdprintf("socket start \n");sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0) {printf("socket error \n");return -1;}printf("bind start \n");//将套接⼦与指定端⼝链接if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0) {printf("bind error \n");return -1;}//监听套接⼦printf("listen start \n");if (listen(sfd, 1024) < 0) {printf("listen error \n");return -1;}for (;;) {//接受来⾃客户端的信息printf("accept start \n");memset(&clent, 0, sizeof(clent));lent = sizeof(clent);ind = accept(sfd, (struct sockaddr *) &clent, &lent);if (ind < 0) {printf("accept error %d \n", ind);return -1;}printf("infor \n");printf("clent addr%s porit %d\n",inet_ntop(AF_INET, &clent.sin_addr, buf, sizeof(buf)),ntohs(clent.sin_port));pid = fork();if (pid == 0) {//⼦进程close(sfd);handle(ind);} else if (pid < 0) {//errorclose(ind);} else {//⽗进程}}return EXIT_SUCCESS;}int handle(int point) {int retn;char buf[1024];for (;;) {retn = read(point, buf, sizeof(buf));if (retn < 0) {printf("read error \n");close(point);break;} else if (retn == 0) {printf("client exit \n");close(point);break;}printf("client:%s\n", buf);if (strcmp("exit", buf) == 0) {printf("exit \n");close(point);return 0;}}return 0;}客户端代码如下:/*============================================================================ Name : client.cAuthor : kingVersion :Copyright : Your copyright noticeDescription : Hello World in C, Ansi-style============================================================================ */#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> /* inet(3) functions */int handle(int fd);int main(void) {int nsd;char buf[1024];char * myaddr = "192.168.231.128";struct sockaddr_in addr;printf("welcome to echo client\n");nsd = socket(AF_INET, SOCK_STREAM, 0);printf("connect start1 \n");//bzero(addr, sizeof(*addr));memset(&addr,0,sizeof(addr));printf("connect start2 \n");addr.sin_family = AF_INET;addr.sin_port = htons(5050);addr.sin_addr.s_addr=inet_addr(myaddr);printf("connect start3 \n");if (connect(nsd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) {printf("connect error \n");return -1;}sleep(5);printf("handle start\n");handle(nsd);close(nsd);return EXIT_SUCCESS;}int handle(int fd) {char sendl[1024], rev[1024];int retn;for (;;) {memset(sendl,0,sizeof(sendl));memset(rev,0,sizeof(rev));if (fgets(sendl, 1024, stdin) == NULL) {break;}//printf("wirte start\n");write(fd, sendl, strlen(sendl));read(fd, rev,strlen(rev));}return 0;}注意:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);记住⼀定是值 addrlenaccept socklen_t *addrlen要是⼀个指针希望本⽂所述对⼤家C语⾔⽹络程序设计的学习有所帮助。

codesys socket 通讯实例

codesys socket 通讯实例

codesys socket 通讯实例Codesys socket通信实例Codesys是一款广泛使用的工控编程软件平台,可以用于编程和控制各种自动化设备。

在Codesys中,socket通信是常见的一种通信方式,通过socket可以实现不同设备之间的数据传输和交流。

本文将以Codesys socket通信实例为主题,详细介绍如何在Codesys中使用socket通信。

1. 确定通信需求在开始使用socket通信之前,首先要确定通信的需求。

比如,我们可能需要将数据从一个设备发送到另一个设备,或者需要从外部设备接收数据并进行处理。

了解通信的具体需求将有助于我们更好地使用Codesys中的socket通信功能。

2. 创建TCP通信在Codesys中,我们可以创建基于TCP协议的socket通信。

首先,我们要创建一个TCP通信通道。

在Codesys的工程管理器中,右键单击项目,并选择“添加设备”选项。

然后,在设备列表中选择“TCP通信”。

3. 配置通信参数在创建TCP通信通道之后,我们需要配置通信的参数。

在通道属性对话框中,我们可以设置通信的IP地址、端口号等参数。

通过设置这些参数,我们可以与目标设备建立连接,并进行数据传输。

4. 建立连接在配置通信参数之后,我们可以在程序中使用socket函数来建立连接。

在Codesys中,我们可以使用SOCKET_OPEN函数来打开一个socket 连接。

该函数需要我们指定通信通道和目标设备的IP地址及端口号作为参数。

例如,我们可以使用以下代码来建立一个socket连接:pascalPROGRAM MainVARhSocket: TSocketHandle;END_VARhSocket := SOCKET_OPEN(TCP_CHANNEL_1, '192.168.1.100', 5000);这个代码片段使用了一个名为hSocket的变量来存储建立的socket连接的句柄。

qt socket 通信实例

qt socket 通信实例

qt socket 通信实例QT是一种跨平台的C++应用程序开发框架,其中包含丰富的网络编程功能,如Socket通信。

本文将介绍如何使用QT实现Socket通信的基本步骤和示例代码。

1. 创建SocketQTCPSocket和QTUDPSocket是QT提供的两个Socket类,前者用于TCP通信,后者用于UDP通信。

创建Socket的基本步骤如下: ```QTcpSocket *socket = new QTcpSocket(this); // 创建一个TCP Socketsocket->connectToHost('127.0.0.1', 8888); // 连接服务器 ```2. 发送数据可以使用QByteArray类作为数据的容器,并使用write()函数将数据发送给服务器。

```QByteArray data = 'Hello world!';socket->write(data);```3. 接收数据使用QT的信号和槽机制,当读取到数据时会触发readyRead()信号。

可以在该信号的槽函数中读取数据。

```connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));...void MyClass::readData(){QByteArray data = socket->readAll();// 处理数据}```4. 关闭Socket使用close()函数关闭Socket连接。

```socket->close();```完整代码示例下面是一个简单的QT Socket通信示例。

```#include <QtNetwork/QTcpSocket>class MyClass : public QObject{Q_OBJECTpublic:MyClass(QObject *parent = nullptr): QObject(parent){socket = new QTcpSocket(this);connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));socket->connectToHost('127.0.0.1', 8888);}public slots:void readData(){QByteArray data = socket->readAll();qDebug() << 'Received data:' << data;}void disconnected(){qDebug() << 'Socket disconnected';}private:QTcpSocket *socket;};int main(int argc, char *argv[]){QCoreApplication app(argc, argv);MyClass myClass(&app);return app.exec();}```这是一个TCP Socket的客户端示例,它连接到服务器127.0.0.1的8888端口,并在接收到数据时输出到控制台。

socket通讯如何接收服务器返回的数据

socket通讯如何接收服务器返回的数据

socket通讯如何接收服务器返回的数据在进行Socket通信中,接收服务器返回的数据是非常重要的一步。

本文将介绍如何有效地接收服务器返回的数据,以确保通信的顺利进行。

一、理解Socket通信的基本原理Socket通信是一种在网络中实现进程间通信的方式。

在Socket通信中,客户端和服务器通过建立网络连接进行数据的传输。

客户端首先与服务器建立连接,然后发送请求,服务器接收到请求后进行处理,并将结果返回给客户端。

二、接收服务器返回的数据的方法在接收服务器返回的数据之前,我们需要先建立好Socket连接,并发送请求。

以下是几种常用的接收服务器返回数据的方法。

1. 通过inputStream接收数据通过inputStream可以从Socket连接中获取服务器返回的数据。

我们可以使用inputStream的read()方法读取数据,read()方法会返回一个int类型的值,表示读到的数据的字节表示。

当返回值为-1时,表示数据已经读取完毕。

2. 通过BufferedReader接收数据使用BufferedReader可以更方便地接收服务器返回的数据。

我们可以使用BufferedReader的readLine()方法逐行读取服务器返回的数据,readLine()方法会将读到的数据以String类型返回。

同样,当返回值为null时,表示数据已经读取完毕。

3. 通过DataInputStream接收数据如果我们预先知道服务器返回数据的格式,可以使用DataInputStream进行数据的接收。

DataInputStream提供了一系列的read方法,可以按照指定的格式读取数据。

比如,我们可以使用readInt()方法读取一个int类型的数据,使用readUTF()方法读取一个UTF-8编码的字符串。

4. 通过ObjectInputStream接收对象数据如果服务器返回的是一个复杂的对象,我们可以使用ObjectInputStream进行数据的接收。

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

基于visual c++之windows核心编程代码分析(10)实现socket通信分类:VC++编程技术Visual C++2010编程技术Visual Studio2012 Windows8 2011-12-17 11:32 120人阅读评论(0) 收藏举报在多台计算机之间实现通信,最常见的方法有两种:Socket通信与UDP通信。

Socket是一种基于TCP/IP协议,建立稳定连接的点对点通信,它的特点是安全性高,数据不会丢失,但是很占系统资源。

在JAVA中,ServerSocket类和Socket类为我们实现了Socket 通信,建立通信的一般步骤是:1。

建立服务器ServerSocket ss = new ServerSocket(端口号);Socket socket = ss.accept();这样,我们就已经建立了服务器,其中accept()方法会阻塞,知道有客户发送一个连接请求,我们可以通过socket.getInputStream()和socket.getOutputStream()来获得输入输出流,如调用socket.getInputStream()获得一个输入流,实际上这个流就是连接对方的一个输出流,流的操作与文件流操作相同,我们可以用操作文件的方法来操作它们。

2。

建立客户端Socket socket = new Socket(主机名,端口号)客户端只需这一句代码就可以与服务器取得连接,这里的主机名应为服务器的IP地址,端口号是服务器用来监听该程序的端口,同样可以通过socket.getInputStream()和socket.getOutputStream()来获得输入输出流。

在以上程序中,已经实现了一个最简单的客户端和服务器的通信。

但是,还有一些问题。

首先,这个通信只执行一次,程序就将结束。

因为我们只读了一次输入流,如果想要建立客户与服务器之间的稳定的会话,就要用到多线程:Thread thread = new Thread(new Sender());thread.start();InputStream input = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(input));while(true){br.readLine();}其中,Sender是一个实现了Runnable接口的类,用它来专门负责发送数据,主线程只需要不听地接受数据就行。

Sender类中的run()方法应该具有以下代码:PrintWriter pw = newPrintWriter(socket.getOutputStream());while(true){pw.println(数据);}即使按上面的方式做了,程序还是有问题,因为它只能在一个时间内为一个客户服务,不能同时为多个客户服务,如多要想同时为多个客户服务,服务器应具有类似以下的代码:ServerSocker ss = new ServerSocker(端口号);socket = null;while(true){socket = ss.accept();Thread thread1 = new Thread(new Sender());thread1.start();Thread thread2 = new Thread(new Receiver());thread2.start();}在这里,新开启了2个线程分别负责接收和发送。

Receiver是一个与Sender非常相似的类,它主要用来接收数据。

在客户端,我们同样应开启2个线程:Socket socket = new Socket(服务器IP,端口号);Sender sender = new Sender(socket);Thread thread1 = new Thread(sender);thread1.start();Receiver receiver = new Receiver(socket);Thread thread2 = new Thread(receiver);thread2.start();我们来亲自动手实现案例实现客户端view plaincopy to clipboardprint?1. /* 头文件 */2. #include <stdio.h>3. #include "winsock2.h"4. /* 常量 */5. #define RECV_BUFFER_SIZE 81926.7. /*************************************8. * main9. * 功能 socket通信客户端10. **************************************/11. void main(int argc, char* argv[])12. {13. // 变量定义14. SOCKADDR_IN clientService;// 地址15. SOCKET ConnectSocket;// socket16. WSADATA wsaData;// 库17. LPVOID recvbuf;// 接收缓存18. int bytesSent;19. int bytesRecv = 0;20. char sendbuf[32] = "get information";// 默认发送的数据21.22. // 初始化socket库,保存ws2_32.dll已经加载23. int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);24. if (iResult != NO_ERROR)25. printf("Error at WSAStartup()\n");26.27. // 创建socket28. ConnectSocket = socket(AF_INET, // IPv429. SOCK_STREAM, // 顺序的、可靠的、基于连接的、双向的数据流通信30. IPPROTO_TCP// 使用TCP协议31. );32. if (ConnectSocket == INVALID_SOCKET)33. {34. printf("Error at socket(): %ld\n", WSAGetLastE35. WSACleanup();36. return;37. }38.39. // 设置服务端的通信协议、IP地址、端口40. clientService.sin_family = AF_INET;41. clientService.sin_addr.s_addr = inet_addr( "127.0.42. clientService.sin_port = htons( 10000 );43.44. // 连接到服务端45. if ( connect(46. ConnectSocket, // socket47. (SOCKADDR*) &clientService, // 地址48. sizeof(clientService) // 地址的大小49. ) == SOCKET_ERROR)50. {51. printf( "Failed to connect(%d)\n",WSAGetLastEr52. WSACleanup();53. return;54. }55. // 准备发送数据56. // 如果输入参数是-d,那么发送的数据是“download file”否则是"get information"57. if(argc ==2 && (!lstrcmp(argv[1], "-d")))58. {59. lstrcpyn(sendbuf, "download file", 32);60. }61. // 向服务端发送数据62. bytesSent = send( ConnectSocket, // socket63. sendbuf,// 发送的数据64. lstrlen(sendbuf)+1,// 数据长度65. 0 );// 无标志66.67. if(bytesSent == SOCKET_ERROR)68. {69. printf( "send error (%d)\n", WSAGetLastError()70. closesocket(ConnectSocket);71. return;72. }73. printf( "Bytes Sent: %ld\n", bytesSent );74.75. // 准备接收数据76. recvbuf = HeapAlloc(GetProcessHeap(), 0, RECV_BUFF77. // 循环接收78. while( bytesRecv != SOCKET_ERROR )79. {80. //Sleep(50);81. bytesRecv = recv( ConnectSocket, // socket82. recvbuf, // 接收数据缓存83. RECV_BUFFER_SIZE,// 缓存大小84. 0 );// 无标志85. if ( bytesRecv == 0 )86. {87. printf( "Connection Closed.\n");88. break;89. }90. // TODO,处理接收的数据,这里只简单的将收到的数据大小显示91. printf( "Bytes Recv: %ld\n", bytesRecv );92. }93. HeapFree(GetProcessHeap(), 0, recvbuf);94. WSACleanup();95. return;96. }实现服务端view plaincopy to clipboardprint?1. /* 头文件 */2. #include <winsock2.h>3. #include <ws2tcpip.h>4. #include <stdio.h>5. /* 常量 */6. #define DEFAULT_PORT "10000" // 端口7. #define MAX_REQUEST 1024 // 接收数据的缓存大小8. #define BUF_SIZE 4096 // 发送数据的缓存大小9.10. /*************************************11. * CommunicationThread12. * 功能用于接收和发送数据的线程13. * 为每一个连接的客户端创建一个接收发送数据的线程,14. * 可以使用多个客户端同时连接到服务端15. * 参数 lpParameter,SOKCET16. **************************************/17. DWORD WINAPI CommunicationThread(18. LPVOID lpParameter19. )20. {21. DWORD dwTid = GetCurrentThreadId();22. // 获得参数sokcet23. SOCKET socket = (SOCKET)lpParameter;24. // 为接收数据分配空间25. LPSTR szRequest = HeapAlloc(GetProcessHeap(),0, MA26. int iResult;27. int bytesSent;// 用于保存send的返回值,实际发送的数据的大小28.29. // 接收数据30. iResult = recv(socket, // socket31. szRequest, // 接收缓存32. MAX_REQUEST, // 缓存大小33. 0);// 标志34. if (iResult == 0)// 接收数据失败,连接已经关闭35. {36. printf("Connection closing...\n");37. HeapFree(GetProcessHeap(), 0 ,szRequest);38. closesocket(socket);39. return 1;40. }41. else if (iResult == SOCKET_ERROR)// 接收数据失败,socket错误42. {43. printf("recv failed: %d\n", WSAGetLastError())44. HeapFree(GetProcessHeap(), 0 ,szRequest);45. closesocket(socket);46. return 1;47. }48. else if (iResult > 0) // 接收数据成功49. {50. // 显示接收到的数据51. printf("\tCommunicationThread(%d)\tBytes recei52. printf("\tCommunicationThread(%d)\trequest str53.54. // 如果接收到的数据是"download file"55. if (lstrcmpi(szRequest, "download file") == 0)56. {57. // 读取文件download.txt将发送58. HANDLE hFile;59. LPVOID lpReadBuf; // 发送缓存60. DWORD dwBytesRead;61. DWORD dwFileSize;62. DWORD dwSendFile = 0;63. hFile = CreateFile("download.txt",64. GENERIC_READ,65. FILE_SHARE_READ,66. NULL,67. OPEN_EXISTING,68. FILE_ATTRIBUTE_NORMAL,69. NULL);70.71. if (hFile == INVALID_HANDLE_VALUE)72. {73. printf("\tCommunicationThread\tCould n74. GetLastError());75. send(socket, "error", 6, 0);76. closesocket(socket);77. return 1;78. }79. // 分配发送数据缓存80. lpReadBuf = HeapAlloc(GetProcessHeap(), 081. // 获取文件大小82. dwFileSize = GetFileSize(hFile, NULL);83. // 循环发送84. while(1)85. {86. // 读文件到缓存87. if(!ReadFile(hFile, lpReadBuf, BUF_SIZ88. {89. printf("\tCommunicationThread\tCou90. GetLastError());91. closesocket(socket);92. CloseHandle(hFile);93. return 1;94. }95. // 发送读取的文件数据96. bytesSent = send(socket, lpReadBuf, dw97. if( bytesSent == SOCKET_ERROR)98. {99. printf("\tCommunicationThread\tsen 100. WSAGetLastError());101. closesocket(socket);102. CloseHandle(hFile);103. return 1;104. }105. // 显示发送数据的大小106. printf("\tCommunicationThread(%d)\tsen 107. // 累加,已经发送的大小108. dwSendFile += dwBytesRead;109. // 如果所有文件数据都已经发送110. if(dwSendFile == dwFileSize)111. {112. printf("\tCommunicationThread\tFil 113. break;// 退出循环114. }115. }116. // 释放内存、关闭连接,关闭文件117. HeapFree(GetProcessHeap(), 0 , lpReadBuf); 118. CloseHandle(hFile);119. closesocket(socket);120. }121. // 如果接收到的数据是"get information"122. else if (lstrcmpi(szRequest, "get information" 123. {124. // 发送数据125. bytesSent = send(socket, // socket126. "this is information", // 数据127. lstrlen("this is information")+1, // 数据长度128. 0);// 标志129. // 判断是否成功130. if( bytesSent == SOCKET_ERROR)131. {132. printf("\tCommunicationThread\tsend er 133. WSAGetLastError());134. closesocket(socket);135. return 1;136. }137. printf("\tCommunicationThread(%d)\tsend %d 138. }139. else// 收到未知数据140. {141. printf ("unreferenced request\n"); 142. }143. }144. // 释放接收数据缓存,关闭socket145. HeapFree(GetProcessHeap(), 0 ,szRequest); 146. closesocket(socket);147. return 0;148. }149.150. /*************************************151. * int __cdecl main(void)152. * 功能 socket服务端153. **************************************/154. int __cdecl main(void)155. {156. WSADATA wsaData;157. SOCKET ListenSocket = INVALID_SOCKET;// 监听socket158. SOCKET ClientSocket = INVALID_SOCKET;// 连接socket159. struct addrinfo *result = NULL,160. hints;161. int iResult;// 保存返回结果162.163. // 初始化Winsock,保证Ws2_32.dll已经加载164. iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 165. if (iResult != 0)166. {167. printf("WSAStartup failed: %d\n", iResult); 168. return 1;169. }170. // 地址171. ZeroMemory(&hints, sizeof(hints));172. hints.ai_family = AF_INET;173. hints.ai_socktype = SOCK_STREAM;174. hints.ai_protocol = IPPROTO_TCP;175. hints.ai_flags = AI_PASSIVE;176.177. // 获取主机地址,保证网络协议可用等178. iResult = getaddrinfo(NULL, // 本机179. DEFAULT_PORT, // 端口180. &hints, // 使用的网络协议,连接类型等181. &result);// 结果182. if ( iResult != 0 )183. {184. printf("getaddrinfo failed: %d\n", iResult); 185. WSACleanup();186. return 1;187. }188.189. // 创建socket,用于监听190. ListenSocket = socket(191. result->ai_family, // 网络协议,AF_INET,IPv4192. result->ai_socktype, // 类型,SOCK_STREAM193. result->ai_protocol);// 通信协议,TCP194. if (ListenSocket == INVALID_SOCKET)195. {196. printf("socket failed: %ld\n", WSAGetLastError 197. freeaddrinfo(result);198. WSACleanup();199. return 1;200. }201. // 绑定到端口202. iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);203. if (iResult == SOCKET_ERROR)204. {205. printf("bind failed: %d\n", WSAGetLastError()) 206. freeaddrinfo(result);207. closesocket(ListenSocket);208. WSACleanup();209. return 1;210. }211. printf("bind\n");212.213. freeaddrinfo(result);// reuslt不再使用214.215. // 开始监听216. iResult = listen(ListenSocket, SOMAXCONN); 217. printf("start listen......\n");218. if (iResult == SOCKET_ERROR)219. {220. printf("listen failed: %d\n", WSAGetLastError( 221. closesocket(ListenSocket);222. WSACleanup();223. return 1;224. }225. while (1)226. {227. // 接收客户端的连接,accept函数会等待,直到连接建立228. printf("ready to accept\n");229. ClientSocket = accept(ListenSocket, NULL, NULL 230. // accept函数返回,说明已经有客户端连接231. // 返回连接socket232. printf("accept a connetion\n");233. if (ClientSocket == INVALID_SOCKET)234. {235. printf("accept failed: %d\n", WSAGetLastEr 236. closesocket(ListenSocket);237. break;// 等待连接错误,退出循环238. }239. // 为每一个连接创建一个数据发送的接收线程,240. // 使服务端又可以立即接收其他客户端的连接241. if(!CreateThread(242. NULL,243. 0,244. CommunicationThread, // 线程函数245. (LPVOID)ClientSocket, // 将socket 作为参数246. 0,247. NULL))248. {249. printf("Create Thread error (%d)", GetLast 250. break;251. }252. }253. // 循环退出,释放DLL。

相关文档
最新文档