c语言socket编程 与服务器长连接的客户端程序
网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!
⽹络编程—【⾃⼰动⼿】⽤C语⾔写⼀个基于服务器和客户端(TCP)!如果想要⾃⼰写⼀个服务器和客户端,我们需要掌握⼀定的⽹络编程技术,个⼈认为,⽹络编程中最关键的就是这个东西——socket(套接字)。
socket(套接字):简单来讲,socket就是⽤于描述IP地址和端⼝,是⼀个通信链的句柄,可以⽤来实现不同虚拟机或不同计算机之间的通信。
✁ TCP 协议TCP 协议:是⼀种⾯向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
在简化的计算机⽹络OSI模型中,它完成第四层传输层所指定的功能。
关键词:三次握⼿,可靠,基于字节流。
可能有朋友会问,TCP就这么简单⼀句话吗?当然不是,TCP作为⾮常重要的传输协议,细节知识是很多的,细讲起来这⼀篇⽂章怕是不够。
不过在本篇内容中,我们只需了解他的⼏个关键词特性,就能很好的理解下⾯的内容。
✁ TCP服务器端和客户端的运⾏流程如图,这是⼀个完整的TCP服务器——客户端的运⾏流程图,其实我个⼈认为程序啊,不管哪个语⾔都是⼀样,核⼼就在于算法的设计和函数的调⽤。
那么图中的函数都是什么意思呢?1.创建socketsocket是⼀个结构体,被创建在内核中sockfd=socket(AF_INET,SOCK_STREAM,0); //AF_INT:ipv4, SOCK_STREAM:tcp协议2.调⽤bind函数将socket和地址(包括ip、port)绑定。
需要定义⼀个结构体地址,以便于将port的主机字节序转化成⽹络字节序structsockaddr_inmyaddr; //地址结构体bind函数bind(sockfd,(structsockaddr*)&myaddr,sizeof(serveraddr))3.listen监听,将接收到的客户端连接放⼊队列listen(sockfd,8) //第⼆个参数是队列长度4.调⽤accept函数,从队列获取请求,返回socket描述符如果⽆请求,将会阻塞,直到获得连接int fd=accept(sockfd,NULL,NULL); //这边采⽤默认参数5.调⽤read/write进⾏双向通信6.关闭accept返回的socketclose(scokfd);下⾯放出完整代码:如果你也想学编程,可以来我的还有免费的(源码,零基础教程,项⽬实战教学视频)!涉及:游戏开发、课程设计、常⽤软件开发、编程基础知识、⿊客等等.../*服务器*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>int main(){int sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字if (sockfd < 0){perror("socket");return -1;} //创建失败的错误处理printf("socket..............\n"); //成功则打印“socket。
socket编程实例
socket编程实例Socket编程是一种基于连接的网络编程技术,它可以让两台计算机相互连接,允许它们通信。
对于Socket编程,可以用C或Python语言编写客户端和服务器应用程序,这些应用程序会在不同的计算机之间通信。
下面的Socket编程实例说明如何使用C和Python编写客户端和服务器应用程序。
使用C语言编写的Socket编程实例首先,创建一个socket文件:#include <sys/types.h>#include <sys/socket.h>int sockfd = socket(AF_INET, SOCK_STREAM, 0);然后,将socket设置为服务器模式,使它能够连接到客户端:struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(PORT_NUMBER);bind(sockfd, (struct sockaddr*)& serv_addr,sizeof(serv_addr));listen(sockfd, 5);最后,接受客户端的连接,并处理客户端的消息:int connfd = accept(sockfd, (struct sockaddr*)NULL, NULL); char buff[1024] = {0};read(connfd, buff, sizeof(buff));//Do something with the buffwrite(connfd, response, strlen(response));close(sockfd);使用Python编写的Socket编程实例首先,创建一个socket文件:import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)然后,将socket设置为服务器模式,使它能够连接到客户端:server_address = ('localhost', 10000)sock.bind(server_address)sock.listen(1)最后,接受客户端的连接,并处理客户端的消息:connection, client_address = sock.accept()try:while True:data = connection.recv(1024)if data:#Do something with the dataconnection.sendall(response)else:breakfinally:connection.close()。
通过Netty、WebSocket实现服务端和客户端长连接的一种方法
通过Netty、WebSocket实现服务端和客户端长连接的⼀种⽅法WebSocket与Http、Socket的区别和联系WebSocket同HTTP⼀样也是应⽤层的协议,但是它是⼀种双向通信协议,是建⽴在TCP之上的。
WebSocket与HTTP的关系相同点都是⼀样基于TCP的,都是可靠性传输协议。
都是应⽤层协议。
不同点WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。
HTTP是单向的。
WebSocket是需要握⼿进⾏建⽴连接的。
联系WebSocket在建⽴握⼿时,数据是通过HTTP传输的。
但是建⽴之后,在真正传输时候是不需要HTTP协议的WebSocket与Socket的关系Socket其实并不是⼀个协议,⽽是为了⽅便使⽤TCP或UDP⽽抽象出来的⼀层,是位于应⽤层和传输控制层之间的⼀组接⼝Socket是应⽤层与TCP/IP协议族通信的中间软件抽象层,它是⼀组接⼝。
在设计模式中,Socket其实就是⼀个门⾯模式,它把复杂的TCP/IP协议族隐藏在Socket接⼝后⾯,对⽤户来说,⼀组简单的接⼝就是全部,让Socket去组织数据,以符合指定的协议。
Socket是传输控制层协议,WebSocket是应⽤层协议。
短连接与长连接短连接连接——>传输数据——>关闭连接HTTP是⽆状态的,浏览器和服务器每进⾏⼀次通信,就建⽴⼀次连接,但通信结束就中断连接,这就是短连接。
也可以这样说:短连接是指socket连接后,发送接收完数据后马上断开连接。
⽆状态的意思是:HTTP协议不具备保存之前发送过的请求或响应的功能。
每次的请求是相互独⽴的,第n次的请求结果和第n-1次、第n+1次的请求结果不会互相影响,服务器也不会保存客户端的状态,客户端必须每次带上⾃⼰的状态去请求服务器。
长连接连接——>传输数据——>保持连接——>传输数据——>......——>直到某⼀⽅关闭连接(⼀般是客户端关闭连接)基于WebSocket实现服务端和客户端长连接设计⽅案1、实现基于webSocket的长连接的全双⼯的交互2、改变 Http 协议多次请求的约束,实现长连接,服务器可以发送消息给浏览器3、客户端浏览器和服务器端会相互感知,⽐如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务器会感知关键代码实现服务端实现public class MyServer {public static void main(String[] args) throws Exception{//创建两个线程组EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup(); //8个NioEventLooptry {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup);serverBootstrap.channel(NioServerSocketChannel.class);serverBootstrap.handler(new LoggingHandler());serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//因为基于http协议,使⽤http的编码和解码器pipeline.addLast(new HttpServerCodec());//是以块⽅式写,添加ChunkedWriteHandler处理器pipeline.addLast(new ChunkedWriteHandler());/*说明1. http数据在传输过程中是分段, HttpObjectAggregator ,就是可以将多个段聚合2. 这就就是为什么,当浏览器发送⼤量数据时,就会发出多次http请求*/pipeline.addLast(new HttpObjectAggregator(8192));/*说明1. 对应websocket ,它的数据是以帧(frame) 形式传递2. 可以看到WebSocketFrame 下⾯有六个⼦类3. 浏览器请求时 ws://localhost:7000/hello 表⽰请求的uri4. WebSocketServerProtocolHandler 核⼼功能是将 http协议升级为 ws协议 , 保持长连接5. 是通过⼀个状态码 101*/pipeline.addLast(new WebSocketServerProtocolHandler("/hello2"));//⾃定义的handler ,处理业务逻辑pipeline.addLast(new MyTextWebSocketFrameHandler());}});//启动服务器ChannelFuture channelFuture = serverBootstrap.bind(7000).sync();channelFuture.channel().closeFuture().sync();}finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}}//这⾥ TextWebSocketFrame 类型,表⽰⼀个⽂本帧(frame)public class MyTextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame>{@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {System.out.println("服务器收到消息 " + msg.text());//回复消息ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间" + LocalDateTime.now() + " " + msg.text())); }//当web客户端连接后,触发⽅法@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {//id 表⽰唯⼀的值,LongText 是唯⼀的 ShortText 不是唯⼀System.out.println("handlerAdded 被调⽤" + ctx.channel().id().asLongText());System.out.println("handlerAdded 被调⽤" + ctx.channel().id().asShortText());}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {System.out.println("handlerRemoved 被调⽤" + ctx.channel().id().asLongText());}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {System.out.println("异常发⽣ " + cause.getMessage());ctx.close(); //关闭连接}}客户端实现<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><script>var socket;//判断当前浏览器是否⽀持websocketif(window.WebSocket) {//go onsocket = new WebSocket("ws://localhost:7000/hello2");//相当于channelReado, ev 收到服务器端回送的消息socket.onmessage = function (ev) {var rt = document.getElementById("responseText");rt.value = rt.value + "\n" + ev.data;}//相当于连接开启(感知到连接开启)socket.onopen = function (ev) {var rt = document.getElementById("responseText");rt.value = "连接开启了.."}//相当于连接关闭(感知到连接关闭)socket.onclose = function (ev) {var rt = document.getElementById("responseText");rt.value = rt.value + "\n" + "连接关闭了.."}} else {alert("当前浏览器不⽀持websocket")}//发送消息到服务器function send(message) {if(!window.socket) { //先判断socket是否创建好return;}if(socket.readyState == WebSocket.OPEN) {//通过socket 发送消息socket.send(message)} else {alert("连接没有开启");}}</script><form onsubmit="return false"><textarea name="message" style="height: 300px; width: 300px"></textarea><input type="button" value="发⽣消息" onclick="send(this.form.message.value)"><textarea id="responseText" style="height: 300px; width: 300px"></textarea><input type="button" value="清空内容" onclick="document.getElementById('responseText').value=''"> </form></body></html>实现效果参考1、2、。
使用socket实现长连接
使⽤socket实现长连接我们常⽤的Ajax请求,是HTTP请求,请求过程是建⽴连接、客户端发送请求给服务器、服务端返回结果给客户端、关闭连接,这称为短连接。
若想要实现长连接,即⼀直保持连接,⽽且服务器甚⾄可以直接发消息通知客户端,则需要使⽤socket技术。
代码实现如下:mounted() {this.initWebSocket()}socket相关函数如下:initWebSocket() { // 初始化weosocketconst wsuri = WS_URL + '/createConnect'this.websock = new WebSocket(wsuri + '?token=' + getToken() + '&connectId=' + uuid.v1())this.websock.onmessage = this.websocketonmessagethis.websock.onopen = this.websocketonopenthis.websock.onerror = this.websocketonerrorthis.websock.onclose = this.websocketclose},websocketonopen() { // 连接建⽴之后执⾏send⽅法发送数据const data = Object.assign({}, { 'pageSize': 10, 'pageNum': 1 })const actions = { 'data': data, 'module': 'getColdAlarmLog' }this.websocketsend(JSON.stringify(actions))},websocketonerror() { // 连接建⽴失败重连activeToken().then(rspData => {if (rspData.data.code === 200) {setTimeout(this.initWebSocket(), 15000)}})},websocketonmessage(e) { // 数据接收let socketReturnVal = JSON.parse(e.data)console.log('socketReturnVal', socketReturnVal)if (socketReturnVal == 'alarmFlag') {('监听到新的告警信息')this.handleQuery()}},websocketsend(data) { // 数据发送this.websock.send(data)},websocketclose(e) { // 关闭console.log('断开连接', e)activeToken().then(rspData => {console.log("正在进⾏重连1-1")if (rspData.data.code === 200) {console.log("正在进⾏重连1-2")setTimeout(this.initWebSocket(), 15000)}})}其中,WS_URL的值为ws://localhost:8901上⾯的代码需要导⼊uuid库"vue-uuid": "^1.1.1"import { uuid } from 'vue-uuid'socket技术常⽤于监控中,即后台产⽣告警消息,前端接受到消息(onmessage)做出响应。
socket长连接客户端服务端
package com.socket;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.Reader;import .Socket;import java.nio.CharBuffer;/*** Socket长连接客户端*/public class Client03 {private String host = "127.0.0.1";private int port = 5055;/*** 数据发送线程*/class SendThread implements Runnable {private Socket socket;public SendThread(Socket socket) {this.socket = socket;}public void run() {while (true) {try {PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));pw.write("this is client");pw.flush();Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}}}}/*** 数据接收线程*/class ReceiveThread implements Runnable {private Socket socket;public ReceiveThread(Socket socket) {this.socket = socket;}public void run() {while (true) {try {Reader reader = new InputStreamReader(socket.getInputStream());CharBuffer charBuffer = CharBuffer.allocate(8192);@SuppressWarnings("unused")int charIndex = -1;while ((charIndex = reader.read(charBuffer)) != -1) {charBuffer.flip();System.out.println("client--> " + charBuffer.toString());}} catch (IOException e) {e.printStackTrace();}}}}private void start() {try {Socket socket = new Socket(host, port);// 创建Socketnew Thread(new SendThread(socket)).start();// 启动读线程new Thread(new ReceiveThread(socket)).start();// 启动收线程} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {new Client03().start();}}package com.socket;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Reader;import java.io.Writer;import .ServerSocket;import .Socket;import java.nio.CharBuffer;/*** Socket长连接服务端*/public class Server03 {private ServerSocket serverSocket;private Socket socket;private int port = 5055;private void start() throws Exception {serverSocket = new ServerSocket(port);while (true) {socket = serverSocket.accept();new Thread(new SocketThread(socket)).start();// 多线程阻塞}}/*** 处理socket连接s*/class SocketThread implements Runnable {private Socket socket;private String temp = "";public SocketThread(Socket socket) {this.socket = socket;}@SuppressWarnings("unused")public void run() {try {Reader reader = new InputStreamReader(socket.getInputStream());Writer writer = new OutputStreamWriter(socket.getOutputStream());CharBuffer charBuffer = CharBuffer.allocate(1024);int readIndex = -1;while ((readIndex = reader.read(charBuffer)) != -1) {charBuffer.flip();temp += charBuffer.toString();System.out.println("server-->" + temp);writer.write("this is server");writer.flush();}} catch (IOException e) {e.printStackTrace();} finally {if (socket != null) {if (!socket.isClosed()) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}}public static void main(String[] args) {Server03 s = new Server03();try {s.start();} catch (Exception e) {e.printStackTrace();}}}。
Socket客户端和服务端的编程实现(C#和android附运行截图)
2014 —2015 学年第二学期实验课程名称:计算机新技术讲座第一部分:实验分析与设计一、实验内容描述(问题域描述)1、实验目的1.1理解套接字(socket)通信的基本原理和机制1.2理解进程间通信的机制。
2、实验要求分别编写客服端和服务器端代码,建立客户端与服务器端之间正确的socket连结(语言自选,附源代码)二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等)1.实验原理网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket的英文原义是“孔”或“插座”。
作为BSD UNIX的进程通信机制,取后一种意思。
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
Socket 正如其英文原意那样,像一个多孔插座。
一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。
客户软件将插头插到不同编号的插座,就可以得到不同的服务。
常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket (SOCK_DGRAM)。
流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
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"。
C#编程socket编程之tcp服务器端和客户端
C#编程socket编程之tcp服务器端和客户端基于Tcp协议的Socket通讯类似于B/S架构,⾯向连接,但不同的是服务器端可以向客户端主动推送消息。
使⽤Tcp协议通讯需要具备以下⼏个条件:(1).建⽴⼀个套接字(Socket)(2).绑定服务器端IP地址及端⼝号--服务器端(3).利⽤Listen()⽅法开启监听--服务器端(4).利⽤Accept()⽅法尝试与客户端建⽴⼀个连接--服务器端(5).利⽤Connect()⽅法与服务器建⽴连接--客户端(6).利⽤Send()⽅法向建⽴连接的主机发送消息(7).利⽤Recive()⽅法接受来⾃建⽴连接的主机的消息(可靠连接)下⾯⽤代码实现简单的服务器---客户端通信,在此实例中两⽅只能收发⼀次消息,如果要进⾏多次消息,要使⽤到线程。
服务器端:using System;using System.Collections.Generic;using System.Linq;using ;using .Sockets;using System.Text;using System.Threading.Tasks;namespace _021_socket编程_TCP协议 {class Program {static void Main(string[] args) {// 1,创建socketSocket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2,绑定ip跟端⼝号IPAddress ipaddress = new IPAddress(new byte[]{192,168,1,101});EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是对ip+端⼝做了⼀层封装的类tcpServer.Bind(point);//向操作系统申请⼀个可⽤的ip跟端⼝号⽤来做通信//3,开始监听(等待客户端连接)tcpServer.Listen(100);//参数是最⼤连接数Console.WriteLine("开始监听");Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有⼀个客户端连接过来,之后进⾏下⾯的代码Console.WriteLine("⼀个客户端连接过来了");//使⽤返回的socket跟客户端做通信string message = "hello 欢迎你";byte[] data = Encoding.UTF8.GetBytes(message);//对字符串做编码,得到⼀个字符串的字节数组clientSocket.Send(data);Console.WriteLine("向客户端发送了⼀条数据");byte[] data2 = new byte[1024];//创建⼀个字节数组⽤来当做容器,去承接客户端发送过来的数据int length = clientSocket.Receive(data2);string message2 = Encoding.UTF8.GetString(data2, 0, length);//把字节数据转化成⼀个字符串Console.WriteLine("接收到了⼀个从客户端发送过来的消息:"+message2);Console.ReadKey();}}}客户端:using System;using System.Collections.Generic;using System.Linq;using ;using .Sockets;using System.Text;using System.Threading.Tasks;namespace _001_socket编程_tcp协议_客户端 {class Program {static void Main(string[] args) {//1,创建socketSocket tcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);//2,发起建⽴连接的请求IPAddress ipaddress = IPAddress.Parse("192.168.1.101");//可以把⼀个字符串的ip地址转化成⼀个ipaddress的对象 EndPoint point = new IPEndPoint(ipaddress,7788);tcpClient.Connect(point);//通过ip:端⼝号定位⼀个要连接到的服务器端byte[] data = new byte[1024];int length = tcpClient.Receive(data);//这⾥传递⼀个byte数组,实际上这个data数组⽤来接收数据//length返回值表⽰接收了多少字节的数据string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据做⼀个转化Console.WriteLine(message);//向服务器端发送消息string message2 = Console.ReadLine();//读取⽤户的输⼊把输⼊发送到服务器端tcpClient.Send( Encoding.UTF8.GetBytes(message2) );//把字符串转化成字节数组,然后发送到服务器端Console.ReadKey();}}}执⾏过程:(1)⾸先开启服务器(2)然后开启客户端,此时,客户端连接到服务器,收到服务器发来的消息(3)在客户端输⼊⼀条消息发给服务器。
c socket 编程
c socket 编程C语言中使用Socket编程可以实现网络通信,主要针对TCP和UDP两种协议。
下面是C Socket编程的相关参考内容。
1. 应用层通信模型:- 客户端/服务器模型:客户端向服务器发送请求,服务器接收请求并发送回复。
- 对等通信模型:两个或多个进程之间直接通信,不需要中间服务器。
2. Socket编程流程:- 创建Socket:使用`socket()`函数创建一个Socket。
- 绑定Socket:使用`bind()`函数将Socket绑定到一个特定的地址和端口号。
- 监听连接请求:对于服务器端,使用`listen()`函数监听连接请求。
- 接收连接请求:对于服务器端,使用`accept()`函数接收连接请求。
- 建立连接:对于客户端,使用`connect()`函数连接到服务器。
- 发送和接收数据:使用`send()`和`recv()`函数发送和接收数据。
- 关闭连接:使用`close()`函数关闭Socket连接。
3. TCP Socket编程:- 创建Socket:使用`socket(AF_INET, SOCK_STREAM, 0)`函数创建TCP Socket。
- 绑定Socket:使用`bind()`函数将Socket绑定到服务器的地址和端口号。
- 监听连接请求:使用`listen()`函数开始监听连接请求。
- 接收连接请求:使用`accept()`函数接收来自客户端的连接请求,并创建一个新的Socket用于通信。
- 建立连接:使用`connect()`函数连接到服务器的地址和端口号。
- 发送和接收数据:使用`send()`和`recv()`函数发送和接收数据。
- 关闭连接:使用`close()`函数关闭Socket连接。
4. UDP Socket编程:- 创建Socket:使用`socket(AF_INET, SOCK_DGRAM, 0)`函数创建UDP Socket。
CSocket客户服务连接程序讲解代码
一,客户端程序:// CClientView.cpp : implementation of the CCClientView class//#include "stdafx.h"#include "CClient.h"#include "CClientDoc.h"#include "CClientView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CCClientViewIMPLEMENT_DYNCREA TE(CCClientView, CEditView)BEGIN_MESSAGE_MAP(CCClientView, CEditView)//{{AFX_MSG_MAP(CCClientView)ON_COMMAND(ID_BUTTON_CLOSE, OnButtonClose)ON_COMMAND(ID_BUTTON_CONNECT, OnButtonConnect)ON_COMMAND(ID_BUTTON_SEND, OnButtonSend)ON_UPDA TE_COMMAND_UI(ID_BUTTON_CLOSE, OnUpdateButtonClose)ON_UPDA TE_COMMAND_UI(ID_BUTTON_CONNECT, OnUpdateButtonConnect) ON_UPDA TE_COMMAND_UI(ID_BUTTON_SEND, OnUpdateButtonSend)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview) END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCClientView construction/destructionCCClientView::CCClientView(){// TODO: add construction code here}CCClientView::~CCClientView(){}BOOL CCClientView::PreCreateWindow(CREA TESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREA TESTRUCT csBOOL bPreCreated = CEditView::PreCreateWindow(cs);cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);// Enable word-wrappingreturn bPreCreated;}/////////////////////////////////////////////////////////////////////////////// CCClientView drawingvoid CCClientView::OnDraw(CDC* pDC){CCClientDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CCClientView printingBOOL CCClientView::OnPreparePrinting(CPrintInfo* pInfo){// default CEditView preparationreturn CEditView::OnPreparePrinting(pInfo);}void CCClientView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo){// Default CEditView begin printing.CEditView::OnBeginPrinting(pDC, pInfo);}void CCClientView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo){// Default CEditView end printingCEditView::OnEndPrinting(pDC, pInfo);}/////////////////////////////////////////////////////////////////////////////// CCClientView diagnostics#ifdef _DEBUGvoid CCClientView::AssertV alid() const{CEditView::AssertV alid();}void CCClientView::Dump(CDumpContext& dc) const{CEditView::Dump(dc);}CCClientDoc* CCClientView::GetDocument() // non-debug version is inline {ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCClientDoc)));return (CCClientDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CCClientView message handlersvoid CCClientView::OnButtonClose(){// TODO: Add your command handler code herefor(int i = 0 ;i < 200; i ++){m_sock[i].ShutDown();}}void CCClientView::OnButtonConnect(){// TODO: Add your command handler code herefor(int i = 0 ;i < 200; i ++){m_sock[i].Create();m_sock[i].SetV iew(this);m_sock[i].Connect("127.0.0.1",2012);m_sock[i].m_bConnecting=TRUE;}}void CCClientView::OnButtonSend(){// TODO: Add your command handler code herechar buffer[256];wsprintf(buffer,"How are you?");char *news;int len;int index = 0;news = GetNews(&len);CString msg = CString(news);for(int i = 0 ; i < 200 ; i ++ ){if(m_sock[i].m_bConnected){if(index == -1) index = 0;int inex = msg.Find('\n',index) - 1;CString tmp = msg.Mid(index,inex - index) ;LPTSTR buff = tmp.GetBuffer(tmp.GetLength());m_sock[i].Send(buff,tmp.GetLength());CString tsg;tsg.Format("Sent message: [%s]. \r\n",buff);OutputMsg(this,tsg);index = inex + 2;}}}void CCClientView::OnUpdateButtonClose(CCmdUI* pCmdUI){pCmdUI->Enable(m_sock[0].m_bConnected);}void CCClientView::OnUpdateButtonConnect(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code herepCmdUI->Enable(!m_sock[0].m_bConnecting && !m_sock[0].m_bConnected);}void CCClientView::OnUpdateButtonSend(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code herepCmdUI->Enable(m_sock[0].m_bConnected);}char * CCClientView::GetNews(int *plen){char *buff;CFile file;if(file.Open("msg.txt",CFile::modeRead)){int len = file.GetLength();*plen = len + 1;buff = new char[len + 1];file.Read(buff,len);buff[len] = '\0';file.Close();}return buff;}二,服务器端// CServerView.h : interface of the CCServerView class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CSERVERVIEW_H__B60CC748_3AF2_455B_A803_4F8BD05421E9__I NCLUDED_)#defineAFX_CSERVERVIEW_H__B60CC748_3AF2_455B_A803_4F8BD05421E9__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000inline void OutputMsg(CEditVie w* pView,LPCSTR msg){CString str;pVie w->GetEditCtrl().GetWindowT ext(str);pVie w->GetEditCtrl().SetWindowT ext(str+msg);}class CProcessSocket : public CAsyncSocket{CEditVie w* m_pView;virtual void OnReceive(int nErrorCode){char buffer[256];int len=Receive(buffer,sizeof(buffer));buffer[len - 1] = '\0';CString msg;msg.Format("Received message [%s], length %d from %s. | ",buffer,len,m_addr);OutputMsg(m_pView,msg);wsprintf(buffer,"Good, 谢谢!.");Send(buffer,sizeof(buffer));msg.Format("Request [%s].\r\n",buffer);OutputMsg(m_pView,msg);}virtual void OnClose(int nErrorCode){CString msg;msg.Format("Closed connection with %s.\r\n",m_addr);OutputMsg(m_pView,msg);//delete this;m_bIsClose = true;}public:BOOL m_bIsClose;CString m_addr;CProcessSocket(CEditView* pView){m_pView=pView;}};class CWaitSocket : public CAsyncSocket{CEditVie w* m_pView;virtual void OnAccept(int nErrorCode){for(int i = 0 ; i < m_SocketList.GetSize() ; i ++ ){if(m_SocketList[i]->m_bIsClose == true){delete m_SocketList[i];m_SocketList.RemoveAt(i);break;}}if(m_SocketList.GetSize() >= 100){return;}CProcessSocket *pSock = new CProcessSocket(m_pView);sockaddr_in client;int len=sizeof(client);Accept(*pSock,(sockaddr*)&client,&len);pSock->m_addr.Format("%s:%d",inet_ntoa(client.sin_addr),ntohs(client.sin_port));CString msg;msg.Format("Accepted connection from %s.\r\n",pSock->m_addr);OutputMsg(m_pView,msg);m_SocketList.Add(pSock);}public:CArray <CProcessSocket*,CProcessSocket*> m_SocketList;void SetView(CEditView* pView){m_pView=pView;}~CWaitSocket(){for(int i = 0 ; i < m_SocketList.GetSize() ; i ++ ){delete m_SocketList[i];}}};class CCServerView : public CEditView{protected: // create from serialization onlyCCServerView();DECLARE_DYNCREATE(CCServerView)// Attributespublic:CCServerDoc* GetDocument();CWaitSocket m_sock;// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCServerView)public:virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementationpublic:virtual ~CCServerView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// Generated message map functionsprotected://{{AFX_MSG(CCServerView)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef _DEBUG// debug version in CServerView.cppinline CCServerDoc* CCServerView::GetDocument(){ return (CCServerDoc*)m_pDocument; }#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CSERVERVIEW_H__B60CC748_3AF2_455B_A803_4F8BD05421E9__IN CLUDED_)int CCServerView::OnCreate(LPCREATESTRUCT lpCreateS truct){if (CEditView::OnCreate(lpCreateStruct) == -1)return -1;m_sock.SetView(this);if(m_sock.Create(2012)){m_sock.Listen();}else{AfxMessageBox("Failed to create socket.");}return 0;}。
c语言tcp长连接实例
c语言tcp长连接实例TCP长连接是指客户端和服务器端的连接没有被立即中断,而是保持一定时间的连接状态,当需要再次通信时可以直接使用已经建立的连接,而不必重新进行握手操作。
这种握手时间的缩短,对于大量的高频交互来说能够节约很多时间和资源。
在C语言中,可以通过以下实例来实现TCP长连接。
1.建立TCP服务器端我们需要先打开一个 socket,绑定端口号,并监听请求。
```int listen_fd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof servaddr);servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listen_fd, (struct sockaddr *)&servaddr, sizeof servaddr);listen(listen_fd, LISTENQ);```2.等待客户端请求服务器端需要不停地等待客户端的连接请求,通过 accept() 函数来接受请求并建立连接,然后可以进行数据交互。
```for (;;) {clilen = sizeof(cliaddr);conn_fd = accept(listen_fd, (struct sockaddr *)&cliaddr, &clilen);printf("connection from %s, port %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, buf, sizeof buf),ntohs(cliaddr.sin_port));char buf[MAXLINE];memset(buf, 0, sizeof(buf));int n = read(conn_fd, buf, MAXLINE);if (n < 0) {printf("read error\n");close(conn_fd);continue;}printf("received message: %s", buf);write(conn_fd, buf, n);close(conn_fd);}```3.建立TCP客户端客户端需要连接服务器,然后可以通过连接发送数据并接受服务器反馈的数据。
Socket编程——客户端,服务器端的读写操作
Socket编程——客户端,服务器端的读写操作URL⽹络编程,最⼤的特征就是⼀对⼀的响应!1:客户端“写”,服务器端⽤于“读”1package coreBookSocket2;23import java.io.InputStreamReader;4import java.io.Reader;5import .ServerSocket;6import .Socket;78/*9 * 这边为服务器端的读取10*/1112/*13 * 1:⾸先建⽴⼀个ServerSocket监听在端⼝8888上⾯,服务器端只需要定义和客户端相同的端⼝号即可14 * 2:服务器端尝试接受来⾃客户端的请求15 * 3:和客户端连接好了之后,就可以读取来⾃客户端的输⼊信息16 * 4:定义⼀个StringBuilder对象⽤来保存来⾃客户端的信息17 * 5:关闭Reader,client,server等占⽤资源的对象18*/19public class clientWtiteserverOpen {2021public static void main(String[] args) throws Exception{22 ServerSocket server=new ServerSocket(8888);23 Socket client =server.accept();24 Reader reader=new InputStreamReader(client.getInputStream()); //客户端获取⾃⼰的输⼊流25char[] ch=new char[64];26int len;27 StringBuilder sb=new StringBuilder();28while( ( len=reader.read(ch) )!=-1)29 {30 sb.append(ch, 0, len);31 }32 System.out.println("From Client:"+sb);33 reader.close();34 client.close();35 server.close();36 }37 }1package coreBookSocket2;23import java.io.IOException;4import java.io.OutputStreamWriter;5import java.io.Writer;6import .Socket;7import .UnknownHostException;8/*9 * 这边为客户端的写出10*/1112/*13 * 1:⾸先建⽴⼀个客户端的监听端⼝和IP地址,⽤相同的端⼝号与服务器端建⽴连接14 * 2:从客户端向服务器端写出数据15*/16public class clientWriteserverOpen2 {17public static void main(String[] args) throws UnknownHostException, IOException {1819 Socket client=new Socket("127.0.0.1", 8888);20 Writer writer=new OutputStreamWriter(client.getOutputStream());21 writer.write("Hello server");22 writer.flush();23 writer.close();24 client.close();2526 }2728 }2:客户端先写后读,服务器端先读后写服务器端:1package ClientAndServerWriteBoth;23import java.io.IOException;4import java.io.InputStreamReader;5import java.io.OutputStreamWriter;6import java.io.Reader;7import java.io.Writer;8import .ServerSocket;9import .Socket;1011/*12 * 服务器端的编写13 * 服务器端是先读后写,那么客户端必定是先写后读14*/1516public class server {17public static void main(String[] args) throws IOException {1819 ServerSocket server=new ServerSocket(6666);20 Socket client=server.accept();2122 Reader reader=new InputStreamReader(client.getInputStream());23char[] ch=new char[20];24int len;25 StringBuilder sb=new StringBuilder();26 String temp;27int index;2829while(( len=reader.read(ch)) !=-1)30 {31 temp=new String(ch, 0, len);32if( (index = temp.indexOf("eof")) != -1)//遇到eof时就结束接收, 这个地⽅没有怎么看明⽩?为什么到eof就结束?33 {34 sb.append(temp.substring(0, index));35break;36 }37 sb.append(temp);38 }39 System.out.println("---From Client: "+sb);4041 Writer writer=new OutputStreamWriter(client.getOutputStream());42 writer.write("Hello Client I'm server! ");43 writer.flush();44 writer.close();45 reader.close();46 client.close();47 server.close();48 }49 }客户端:1package ClientAndServerWriteBoth;23import java.io.IOException;4import java.io.InputStreamReader;5import java.io.OutputStreamWriter;6import java.io.Reader;7import java.io.Writer;8import .Socket;9import .UnknownHostException;1011/*12 * 客户端的编写,客户端先写后读13 * 1:客户端设定特定的端⼝号与服务器端连接14*/1516public class client {17public static void main(String[] args) throws UnknownHostException, IOException {1819 Socket client=new Socket("127.0.0.1", 6666);20 Writer writer=new OutputStreamWriter(client.getOutputStream());21 writer.write("Hello server, I'm your father,client! 哈哈哈哈哈");22 writer.flush();23//写完了开始读2425 Reader reader=new InputStreamReader(client.getInputStream());26char[] ch=new char[20];27int len;28 StringBuffer sb=new StringBuffer();29 String temp;30int index;3132while( (len=reader.read(ch))!=-1)34 temp=new String(ch, 0, len);35if(( index=temp.indexOf("eof"))!=-1)36 {37 sb.append(temp.substring(0, index));38break;39 }40 sb.append(new String(ch, 0, len));41 }42 System.out.println("---From Server: "+sb);43 writer.close();44 reader.close();45 client.close();46 }47 }3:⼀个服务器端,对应多个客户端的连接⼀个服务器端和多个客户端连接最好的⽅式就是⽤线程,因为服务器端接受客户端的连接的accept()⽅法是阻塞式的。
C#实现的Socket服务器端、客户端代码分享
C#实现的Socket服务器端、客户端代码分享服务端:using System;using System.Collections.Generic;using ;using .Sockets;using System.Text;namespace Server{class Program{static void Main(string[] args){Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"),55555);try{server.Bind(point);server.Listen(10);//监听本地端⼝System.Console.WriteLine("开始监听本地端⼝:55555");while (true){Socket sock = server.Accept();byte[] buffer = new byte[1024 * 1024];int n = sock.Receive(buffer);String cmd = Encoding.UTF8.GetString(buffer, 0, n);String result = execCmd(cmd);byte[] bytes = Encoding.UTF8.GetBytes(result);sock.Send(bytes);}}catch (Exception ex){System.Console.WriteLine(ex.Message);return;}}//重定向输⼊输出流,并且⽤cmd执⾏命令private static String execCmd(String cmd){System.Diagnostics.Process p = new System.Diagnostics.Process();p.StartInfo = new System.Diagnostics.ProcessStartInfo();p.StartInfo.FileName = "cmd.exe";p.StartInfo.Arguments ="/c "+cmd;//隐藏程序外壳p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//在这⾥重定向输出即可,因为不是交互式的,如果需要交互式的直接反弹cmd即可p.StartInfo.RedirectStandardOutput = true;eShellExecute = false;p.StartInfo.CreateNoWindow = true;p.Start();return p.StandardOutput.ReadToEnd();}}}客户端:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using ;using .Sockets;using System.Text;using System.Threading;using System.Windows.Forms;/** Code By iswin*/namespace Client{public partial class main : Form{public main(){InitializeComponent();this.ip.Text="127.0.0.1";this.cmd.Text="ipconfig";this.port.Text = "55555";}private void send_Click(object sender, EventArgs e){Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); String remoteip=this.ip.Text;String command = this.cmd.Text;IPAddress ip = IPAddress.Parse(remoteip);IPEndPoint point=new IPEndPoint(ip,int.Parse(port.Text));try{this.recvmsg.Text = "开始连接服务端:" + remoteip + ":" + port.Text + "\n";client.Connect(point);this.recvmsg.Text="连接服务端!\n给服务端发送指令:"+command;byte[] buffer = Encoding.UTF8.GetBytes(command);//讲输⼊的指令发送到服务端client.Send(buffer);//接受服务端返回的数据recvmsgs(client);client.Close();}catch (Exception ex){this.recvmsg.Text = ex.Message;MessageBox.Show(ex.Message);return;}}//接受服务端发送来的消息private void recvmsgs(Socket client){try{byte[] buffer = new byte[1024 * 1024];int size = client.Receive(buffer);String recv = Encoding.UTF8.GetString(buffer, 0, size);this.recvmsg.Text = "\n" + recv;}catch (Exception ex){MessageBox.Show(ex.Message);return;}}}}。
socket 编程实现客户端和服务器端通信
#include "StdAfx.h"#include <WINSOCK2.H>#include <iostream>#pragma comment(lib,"WS2_32.lib")#define BUF_SIZE 64int _tmain(int argc,_TCHAR* argv[]){ WSADATA wsd;SOCKET sServer;SOCKET SClient;int retVal;char buf[BUF_SIZE];if (WSAStartup(MAKEWORD(2,2),&wsd)!=0){ printf("wsastartup failed!\n");return 1;}sServer=socket(AF_INET,SOCK_STREAM,IPPROTO _TCP);if (INV ALID_SOCKET==sServer){ printf("socket failed!\n");WSACleanup();return -1;}SOCKADDR_IN addrServ;addrServ.sin_family=AF_INET;addrServ.sin_port=htons(9990);addrServ.sin_addr.S_un.S_addr=htonl(INADDR_ANY);retVal=bind(sServer,(const struct sockaddr*) &addrServ,sizeof(SOCKADDR_IN));if (SOCKET_ERROR==retVal){ printf("bind failed!\n");closesocket(sServer);WSACleanup();return -1; }retVal=listen(sServer,1);if (SOCKET_ERROR==retVal){ printf("listen failed!\n");closesocket(sServer);WSACleanup();return -1; }printf("tcp server start...\n");sockaddr_in addrClient;int addrClientlen=sizeof(addrClient);SClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);if (INV ALID_SOCKET==SClient){printf("accept failed!\n");closesocket(sServer);WSACleanup();return -1;}while(true){ZeroMemory(buf,BUF_SIZE);retVal=recv(SClient,buf,BUF_SIZE,0);if (SOCKET_ERROR==retVal){printf("recv failed!\n");closesocket(sServer);closesocket(SClient);WSACleanup();return -1;}SYSTEMTIME st;GetLocalTime(&st);char sDataTime[30];sprintf(sDataTime,"%4d-%2d-%2d %2d:%2d:%2d",st. wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond) ;printf("%s,recv from client [%s:%d]:%s\n",sDataTime,inet_ntoa(addrClient.sin_addr),ad drClient.sin_port,buf);if (StrCmp(buf,"quit")==0){ retVal=send(SClient,"quit",strlen("quit"),0);break;} else{char msg[BUF_SIZE];sprintf(msg,"message received -%s",buf);retVal=send(SClient,msg,strlen(msg),0);if (SOCKET_ERROR==retVal){printf("send failed!\n");closesocket(sServer);closesocket(SClient);WSACleanup();return -1;} } }closesocket(sServer);closesocket(SClient);WSACleanup();system("pause");return 0;}/#include "StdAfx.h"#include <WINSOCK2.H>#include <iostream>#pragma comment(lib,"WS2_32.lib")#define BUF_SIZE 64int _tmain(int argc,_TCHAR* argv[]){WSADATA wsd;SOCKET sHost;SOCKADDR_IN servAddr;int retVal;char buf[BUF_SIZE];if (WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("wsastartup failed!\n");return 1;}sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_ TCP);if (INV ALID_SOCKET==sHost){printf("socket failed!\n");WSACleanup();return -1;}SOCKADDR_IN addrServ;servAddr.sin_family=AF_INET;servAddr.sin_addr.S_un.S_addr=inet_addr("59.69.132.1 86");//zhujiservAddr.sin_port=htons(9990);int sServerAddlen=sizeof(servAddr);retVal=bind(sHost,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));if (SOCKET_ERROR==retVal){printf("bind failed!\n");closesocket(sHost);WSACleanup();return -1;}retVal=listen(sHost,1);if (SOCKET_ERROR==retVal){printf("listen failed!\n");closesocket(sHost);WSACleanup();return -1;}printf("tcp server start...\n");sockaddr_in addrClient;int addrClientlen=sizeof(addrClient);SClient=accept(sHost,(sockaddrFAR*)&addrClient,&addrClientlen);if (INV ALID_SOCKET==SClient){printf("accept failed!\n");closesocket(sHost);WSACleanup();return -1;}while(true){printf("please input a string to send:");std::string str;std::getline(std::cin,str);ZeroMemory(buf,BUF_SIZE);StrCpy(buf,str.c_str());retVal=send(sHost,buf,strlen(buf),0);if (SOCKET_ERROR==retVal){printf("send failed!\n");closesocket(sHost);WSACleanup();return -1;}retVal=send(sHost,buf,sizeof(buf)+1,0);printf("recv from server:%s\n",buf);if (StrCmp(buf,"quit")==0){retVal=send(SClient,"quit",strlen("quit"),0);break;}}closesocket(sHost);WSACleanup();system("pause");return 0;}。
vc++实现的tcpsocket客户端和服务端示例
vc++实现的tcpsocket客户端和服务端⽰例Tcp Server复制代码代码如下:#include <WinSock2.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")int main(){// initial socket libraryWORD wVerisonRequested;WSADATA wsaData;int err;wVerisonRequested = MAKEWORD(1, 1);err = WSAStartup(wVerisonRequested, &wsaData);if (err != 0){return -1;}//if (LOBYTE(wsaData.wVersion) != 1 ||// HIBYTE(wsaData.wHighVersion) != 1)//{// WSACleanup();// return -1;//}// create socketSOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);// bind socketSOCKADDR_IN addrServer;addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrServer.sin_family = AF_INET;addrServer.sin_port = htons(6000);bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer));// listenlisten(sockServer, 5);SOCKADDR_IN addrClient;int len = sizeof(addrClient);while(1){// acceptSOCKET sockConnection = accept(sockServer, (SOCKADDR *)&addrClient, &len);// sendchar sendBuf[100];sprintf(sendBuf, "Welcome %s", inet_ntoa(addrClient.sin_addr));send(sockConnection, sendBuf, strlen(sendBuf)+1,0);// receivechar recvBuf[100];recv(sockConnection, recvBuf, 100, 0);//printf("%s", recvBuf);// close connection socketclosesocket(sockConnection);}}Tcp Client复制代码代码如下:#include <WinSock2.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")int main(){// initial socket libraryWORD wVerisonRequested;WSADATA wsaData;int err;wVerisonRequested = MAKEWORD(1, 1);err = WSAStartup(wVerisonRequested, &wsaData);if (err != 0){return -1;}//if (LOBYTE(wsaData.wVersion) != 1 ||// HIBYTE(wsaData.wHighVersion) != 1)//{// WSACleanup();// return -1;//}// create socketSOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);// connect server socketSOCKADDR_IN addrServer;addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrServer.sin_family = AF_INET;addrServer.sin_port = htons(6000);connect(sockClient, (SOCKADDR *)&addrServer, sizeof(addrServer)); // receivechar recvBuf[100];recv(sockClient, recvBuf, 100, 0);//printf("%s", recvBuf);// sendchar sendBuf[100] = "this is lisi\n";send(sockClient, sendBuf, strlen(sendBuf)+1,0);// close connection socketclosesocket(sockClient);// clean socket libraryWSACleanup();}。
计算机网络C语言Socket编程,实现两个程序间的通信
计算机⽹络C语⾔Socket编程,实现两个程序间的通信C语⾔S o c k e t编程,实现两个程序间的通信se r v e r和cli e n t通信流程图在mooc上找到的,使⽤Socket客户端client和服务端server通信的流程图不⼀定只⽤codeblock,⽤devcpp编译器也可以的,需要很简单的配置⼀下编译环境实现两个程序间的通信1.服务端se r v e r服务端需要 "两个"套接字 :1.服务端套接字serverSocket2.客户端connect连接请求时,发来的套接字clientSocket按流程图来看, server服务端主要就是实现下⾯⼏个步骤:0.WSAStartup初始化 //这个东西也不知道是什么⿁,反正就是要初始化⼀下,不初始化会创建socket失败!1.服务端套接字 = socket(); //获取⼀个套接字对象吧?2.bind(服务端套接字); //绑定3.listen(服务端套接字); //监听---这个时候客户端就可以发连接请求到服务端了,此时服务端会⽤accept阻塞进程,直到获取客户端发来的请求---4.客户端套接字 = accept(); //收到客户端发来的请求,accept返回客户端的套接字对象5.recv(客户端套接字,要发的消息message) //recv会阻塞进程,直到客户端发送消息过来----printf(message)把接收到的消息打印出来-----6.send(客户端套接字,要发的消息message) //服务端也可以使⽤send,向客户端发送消息---这⾥可以循环,跳转回到步骤3.accept 开启新⼀轮的接收请求---7.closesocket(客户端套接字);所以服务端代码可以这样写在windows下需要更改很多头⽂件,和⼀些函数,wsastartup这个东西也需要初始化⼀下。
改了之后,⼀个可以⽤的服务端server代码#include <sys/stat.h>#include <fcntl.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib, "wsock32.lib")#include <errno.h>#include<stdlib.h>#include<string.h>#include <sys/types.h>#include<ws2tcpip.h>#include <stdio.h>#include <unistd.h>#define SERVER_PORT 6666/*监听后,⼀直处于accept阻塞状态,直到有客户端连接,当客户端如数quit后,断开与客户端的连接*/int main(){//调⽤socket函数返回的⽂件描述符int serverSocket;//声明两个套接字sockaddr_in结构体变量,分别表⽰客户端和服务器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200]; //存储发送和接收的信息int iDataNum;//必须先初始化WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) !=2){ printf("require version fail!");return -1;}//socket函数,失败返回-1//int socket(int domain, int type, int protocol);//第⼀个参数表⽰使⽤的地址类型,⼀般都是ipv4,AF_INET//第⼆个参数表⽰套接字类型:tcp:⾯向连接的稳定数据传输SOCK_STREAM//第三个参数设置为0//建⽴socketif((serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) {perror("socket");return 1;}//初始化server_addrmemset(&server_addr,0, sizeof(server_addr));memset(&server_addr,0, sizeof(server_addr));//初始化服务器端的套接字,并⽤htons和htonl将端⼝和地址转成⽹络字节序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);//ip可是是本服务器的ip,也可以⽤宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//对于bind,accept之类的函数,⾥⾯套接字参数都是需要强制转换成(struct sockaddr *)//bind三个参数:服务器端的套接字的⽂件描述符,if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//设置服务器上的socket为监听状态if(listen(serverSocket, 5) < 0){perror("listen");return 1;}//循环接收消息、发送消息while(1){printf("监听端⼝: %d\n", SERVER_PORT);//调⽤accept函数后,会进⼊阻塞状态//accept返回⼀个套接字的⽂件描述符,这样服务器端便有两个套接字的⽂件描述符,//serverSocket和client。
Socket编程中的长连接、短链接以及心跳包机制详解
Socket编程中的长连接、短链接以及⼼跳包机制详解⼀、定义1、TCP连接 当⽹络通信时采⽤TCP协议时,在真正的读写操作之前,server与client之间必须建⽴⼀个连接,当读写操作完成后,双⽅不再需要这个连接时它们可以释放这个连接。
连接的建⽴是需要三次握⼿的,⽽释放则需要四次握⼿,所以说每个连接的建⽴都是需要资源消耗和时间消耗的。
①连接时经典三次握⼿⽰意图: ②断开连接时经典四次握⼿⽰意图:2、长连接与短连接 所谓长连接,指在⼀个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双⽅发检测包以维持此连接,⼀般需要⾃⼰做在线维持。
所谓短连接,指通信双⽅有数据交互时,就建⽴⼀个TCP连接,数据发送完成后,则断开此TCP连接,⼀般银⾏都使⽤短连接。
⽐如http,只是连接、请求、关闭,过程时间较短,服务器若是⼀段时间内没有收到请求即可关闭连接。
其实长连接是相对于通常的短连接⽽说的,也就是长时间保持客户端与服务端的连接状态。
3、长连接与短连接的操作过程 通常的短连接操作步骤是:连接→数据传输→关闭连接; 长连接通常就是:连接→数据传输→保持连接(⼼跳)→数据传输→保持连接(⼼跳)→……→关闭连接; 这就要求长连接在没有数据通信时,定时发送数据包(⼼跳),以维持连接状态,短连接在没有数据传输时直接关闭就⾏了4、什么时候⽤长连接,短连接? 长连接多⽤于操作频繁,点对点的通讯,⽽且连接数不能太多情况。
每个TCP连接都需要三步握⼿,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不⽤建⽴TCP连接。
例如:的连接⽤长连接,如果⽤短连接频繁的通信会造成socket错误,⽽且频繁的socket 创建也是对资源的浪费。
5、发送接收⽅式 1、异步 报⽂发送和接收是分开的,相互独⽴的,互不影响。
这种⽅式⼜分两种情况: (1)异步双⼯:接收和发送在同⼀个程序中,由两个不同的⼦进程分别负责发送和接收 (2)异步单⼯:接收和发送是⽤两个不同的程序来完成。
vc下socket基本编程(网络端和客户端全)
vc下socket基本编程(网络端和客户端全)基于TCP的socket编程服务端和客户端程序服务器端程序:1、创建socket2、将套接字绑定到一个本地地址和端口上bind3、将套接字设为监听模式,准备接受客户请求listen4、等待客户请求到来;当请求到来后,结合搜此次连接的套接字accept5、用返回的套接字和客户端进行通信send/recv6、返回,等待另一客户请求。
7、关闭套接字。
源码:#include#includevoid main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) {/* Tell the user that we could not find a usable *//* WinSock DLL. */return;}/* Confirm that the WinSock DLL supports 2.2.*//* Note that if the DLL supports versions greater *//* than 2.2 in addition to 2.2, it will still return *//* 2.2 in wVersion since that is the version we *//* requested. */if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) {/* Tell the user that we could not find a usable *//* WinSock DLL. */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,5);SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);while(1){SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);char sendBuf[100];sprintf(sendBuf,"welcome %s to me",inet_ntoa(addrClient.sin_addr));send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100];recv(sockConn,recvBuf,100,0);printf("%s\n",recvBuf);closesocket(sockConn);}}客户端程序:1、创建套接字socket2、想服务器发出连接请求connect3、和服务器进行通信send/recv4、关闭套接字。
C#Socket服务器及多客户端连接示例
C#Socket服务器及多客户端连接⽰例服务端代码[控制台⽰例]static List<Socket> Sockets = new List<Socket>();static void Main(string[] args){int port = 10;byte[] buffer = new byte[1024];IPEndPoint localEP = new IPEndPoint(IPAddress.Any, port);Socket listener = new Socket(localEP.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);try{listener.Bind(localEP);listener.Listen(10);Console.WriteLine("等待客户端连接....");while (true) //该操作⽤于多个客户端连接{Socket sc = listener.Accept();//接受⼀个连接Sockets.Add(sc); //将连接的客户端, 添加到内存当中Thread t = new Thread(new ThreadStart(() => ReceiveData(sc))); //开启当前Socket线程, 去执⾏获取数据的动作,与客户端通信 t.IsBackground = true;t.Start();}}catch (Exception e){Console.WriteLine(e.ToString());}Console.ReadLine();}public static void ReceiveData(Socket sc){byte[] buffer = new byte[1024];Console.WriteLine("接受到了客户端:" + sc.RemoteEndPoint.ToString() + "连接....");//握⼿int length = sc.Receive(buffer);//接受客户端握⼿信息sc.Send(PackHandShakeData(GetSecKeyAccetp(buffer, length)));while (true){try{//接受客户端数据Console.WriteLine("等待客户端数据....");length = sc.Receive(buffer);//接受客户端信息string clientMsg = AnalyticData(buffer, length);Console.WriteLine("接受到客户端数据:" + clientMsg);//发送数据string sendMsg = "服务端返回信息:" + clientMsg;sc.Send(PackData(sendMsg));}catch (Exception ex){Sockets.Remove(sc); //如果接收的过程中,断开, 那么内存中移除当前Socket对象, 并且退出当前线程Console.WriteLine("客户端已经断开连接!");return;}}}Socket 相关类/// <summary>/// 打包握⼿信息/// </summary>/// <param name="secKeyAccept"></param>/// <returns></returns>private static byte[] PackHandShakeData(string secKeyAccept){var responseBuilder = new StringBuilder();responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine);responseBuilder.Append("Upgrade: websocket" + Environment.NewLine);responseBuilder.Append("Connection: Upgrade" + Environment.NewLine);responseBuilder.Append("Sec-WebSocket-Accept: " + secKeyAccept + Environment.NewLine + Environment.NewLine);return Encoding.UTF8.GetBytes(responseBuilder.ToString());}/// <summary>/// ⽣成Sec-WebSocket-Accept/// </summary>/// <param name="handShakeText">客户端握⼿信息</param>/// <returns>Sec-WebSocket-Accept</returns>private static string GetSecKeyAccetp(byte[] handShakeBytes, int bytesLength){string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, bytesLength);string key = string.Empty;Regex r = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n");Match m = r.Match(handShakeText);if (m.Groups.Count != 0){key = Regex.Replace(m.Value, @"Sec\-WebSocket\-Key:(.*?)\r\n", "$1").Trim();}byte[] encryptionString = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); return Convert.ToBase64String(encryptionString);}/// <summary>/// 解析客户端数据包/// </summary>/// <param name="recBytes">服务器接收的数据包</param>/// <param name="recByteLength">有效数据长度</param>/// <returns></returns>private static string AnalyticData(byte[] recBytes, int recByteLength){if (recByteLength < 2) { return string.Empty; }bool fin = (recBytes[0] & 0x80) == 0x80; // 1bit,1表⽰最后⼀帧if (!fin){return string.Empty;// 超过⼀帧暂不处理}bool mask_flag = (recBytes[1] & 0x80) == 0x80; // 是否包含掩码if (!mask_flag){return string.Empty;// 不包含掩码的暂不处理}int payload_len = recBytes[1] & 0x7F; // 数据长度byte[] masks = new byte[4];byte[] payload_data;if (payload_len == 126){Array.Copy(recBytes, 4, masks, 0, 4);payload_len = (UInt16)(recBytes[2] << 8 | recBytes[3]);payload_data = new byte[payload_len];Array.Copy(recBytes, 8, payload_data, 0, payload_len);}else if (payload_len == 127){Array.Copy(recBytes, 10, masks, 0, 4);byte[] uInt64Bytes = new byte[8];for (int i = 0; i < 8; i++){uInt64Bytes[i] = recBytes[9 - i];}UInt64 len = BitConverter.ToUInt64(uInt64Bytes, 0);payload_data = new byte[len];for (UInt64 i = 0; i < len; i++){payload_data[i] = recBytes[i + 14];}}else{Array.Copy(recBytes, 2, masks, 0, 4);payload_data = new byte[payload_len];Array.Copy(recBytes, 6, payload_data, 0, payload_len);}for (var i = 0; i < payload_len; i++){payload_data[i] = (byte)(payload_data[i] ^ masks[i % 4]);}return Encoding.UTF8.GetString(payload_data);}/// <summary>/// 打包服务器数据/// </summary>/// <param name="message">数据</param>/// <returns>数据包</returns>private static byte[] PackData(string message){byte[] contentBytes = null;byte[] temp = Encoding.UTF8.GetBytes(message);if (temp.Length < 126){contentBytes = new byte[temp.Length + 2];contentBytes[0] = 0x81;contentBytes[1] = (byte)temp.Length;Array.Copy(temp, 0, contentBytes, 2, temp.Length);}else if (temp.Length < 0xFFFF){contentBytes = new byte[temp.Length + 4];contentBytes[0] = 0x81;contentBytes[1] = 126;contentBytes[2] = (byte)(temp.Length & 0xFF);contentBytes[3] = (byte)(temp.Length >> 8 & 0xFF);Array.Copy(temp, 0, contentBytes, 4, temp.Length);}else{// 暂不处理超长内容}return contentBytes;}客户端连接[⽹页测试]WebSocket客户端⽰例<html><head><meta charset="utf-8" /><title>WebSockets客户端⽰例</title></head><script>var webSocket;function connect(){try{var readyState = new Array("正在连接","已建⽴连接","正在关闭连接","已关闭连接");var host = "ws://localhost:10";webSocket = new WebSocket(host);var message = document.getElementById("message");message.innerHTML +="<p>Socket状态:" + readyState[webSocket.readyState] + "</p>";webSocket.onopen = function(){message.innerHTML += "<p>Socket状态:" + readyState[webSocket.readyState] + "</p>"; }webSocket.onmessage = function(msg){message.innerHTML +="<p>接收信息:" + msg.data + "</p>";}webSocket.onclose=function(){message.innerHTML +="<p>Socket状态:" + readyState[webSocket.readyState] + "</p>"; }}catch(exception){message.innerHTML += "<p>有错误发⽣</p>";}}function send(){var text = document.getElementById("text").value;var message = document.getElementById("message");if(text == ""){message.innerHTML += "<p>请输⼊⼀些⽂字</p>";return ;}try{webSocket.send(text);message.innerHTML += "<p>发送数据:" +text + "</p>";}catch(exception){message.innerHTML += "<p>发送数据出错</p>";}document.getElementById("text").value="";}function disconnect(){webSocket.close();}</script><body><h1>WebSocket客户端⽰例</h1><div id="message"></div><p>请输⼊⼀些⽂字</p><input id="text" type="text"><button id="connect" onClick="connect();">建⽴连接</button><button id="send" onClick="send();">发送数据</button><button id="disconnect" onClick="disconnect();">断开连接</button> </body></html>。
C#Socket通信客户端服务器端代码
C#Socket通信客户端服务器端代码C/S结构的通信:客户端:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ;using .Sockets;namespace TcpClient{public partial class Form1 : Form{public string serverIP = "127.0.0.1";public int serverPort = 8888;public IPAddress serverIPAddress;public .Sockets.TcpClient tcpClient;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){serverIP = ipbox.Text;serverIPAddress = IPAddress.Parse(serverIP);serverPort = int.Parse(portbox.Text);tcpClient = new .Sockets.TcpClient();tcpClient.Connect(serverIPAddress,serverPort);if (tcpClient == null){MessageBox.Show("⽆法连接到服务器,请重试!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);}else{// 获取⼀个和服务器关联的⽹络流NetworkStream networkStream = tcpClient.GetStream();// 给服务器发送⽤户名byte[] userName_byte = Encoding.Unicode.GetBytes(userNameBox.Text.Trim());networkStream.Write(userName_byte,0,userName_byte.Length);networkStream.Flush();// 读取服务器返回的信息byte[] inforBuffer = new byte[100];networkStream.Read(inforBuffer,0,inforBuffer.Length);networkStream.Flush();string resultFromServer = Encoding.Unicode.GetString(inforBuffer);this.statusbox.Text = resultFromServer;}}}}服务器端:using System;using System.Collections.Generic;using System.Linq;using System.Text;using .Sockets;using ;using System.Threading;namespace TcpServer{class Listener{public TcpListener tcpListener;public int port = 8888;public IPAddress ipAddress = IPAddress.Parse("10.108.13.27");public void Start(){tcpListener = new TcpListener(ipAddress,port);tcpListener.Start();Console.WriteLine("begin listen port {0}",port);while (true){byte[] buffer = new byte[100];Socket newClient = tcpListener.AcceptSocket();newClient.Receive(buffer);string userName = Encoding.Unicode.GetString(buffer).TrimEnd('\0');Console.WriteLine("user :{0} login",userName);newClient.Send(Encoding.Unicode.GetBytes("success"));Thread threadClient = new Thread(new ParameterizedThreadStart(clientProcess)); threadClient.Start(newClient);}}public void clientProcess(object info){Socket socket = info as Socket;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else {
if (len < 0)
printf
("Failed to recerve the message! The error code is %d, error message is'%s'\n",
exit(errno);
}
printf
("\n Ready to start chatting. Direct input message and enter to send messages to the server\n");
while (1) {
continue;
} else {
if (FD_ISSET(sockfd, &rfds)) {
bzero(buffer, MAXBUF + 1);
break;
} else
printf
("News:% s \ t send, sent a total of% d bytes!\n",
break;
} else if (retval == 0) {
/* printf
("No massage comes, no buttons, continue to wait ...\n"); */
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define MAXBUF 1024
int main(int argc, char **argv)
{
int sockfd, len;
struct sockaddr_in dest;
perror(argv[1]);
exit(errno);
}
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
perror("Connect ");
if (!strncasecmp(buffer, "quit", 4)) {
printf("Own request to terminate the chat!\n");
break;
("Message '% s' failed to send! The error code is% d, error message '% s'\n",
buffer, errno, strerror(errno));
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
}
len = send(sockfd, buffer, strlen(buffer) - 1, 0);
if (len < 0) {
printf
FD_ZERO(&rfds);
FD_SET(0, &rfds);
maxfd = Байду номын сангаас;
FD_SET(sockfd, &rfds);
if (sockfd > maxfd)
maxfd = sockfd;
len = recv(sockfd, buffer, MAXBUF, 0);
if (len > 0)
printf
("Successfully received the message: '% s',% d bytes of data\n",
}
}
if (FD_ISSET(0, &rfds)) {
bzero(buffer, MAXBUF + 1);
fgets(buffer, MAXBUF, stdin);
_sec = 1;
_usec = 0;
retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
if (retval == -1) {
printf("Will exit and the select is error! %s", strerror(errno));
}
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(atoi(argv[2]));
if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
char buffer[MAXBUF];
fd_set rfds;
struct timeval tv;
int retval, maxfd = -1;
if (argc != 3) {
printf
("error!the right format should be:\n\t\t%s IP port\n\t eg:\t%s 127.0.0.1 80\n",
errno, strerror(errno));
else
printf("Chat to terminate!\n");
break;
argv[0], argv[0]);
exit(0);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket");
exit(errno);
buffer, len);
}
}
}
close(sockfd);
return 0;
}