这里主要包含客户机和服务器的编程。

一、编程模型函数化

  使用函数说明:socket的理解

服务器:

创建socket使用函数----->socket

绑定地址使用函数------->bind

监听端口使用函数------->listen

等待连续使用函数------->accept

收发使用函数---------->recv/send

结束连续-------------->close

客户机:

创建socket使用函数----->socket

连接服务器函数--------->connect

收发使用函数----------->send/recv

结束连接使用函数------->close

二、首先编写服务器的代码

  touch tcp_server.c

  chmod 777 tcp_server.c

代码如下:

 1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <string.h>
5 #include <netinet/in.h>
6
7 #define portnum 3333
8
9 int main()
10 {
11 int sockfd;
12 int new_fd;
13 char buffer[128];
14 int sin_size;
15 struct sockaddr_in server_addr;
16 struct sockaddr_in client_addr;
17 int nbyte=10; //表示打印前10个字符
18 //1.创建套接字
19 if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
20 {
21 printf("creat socket error!\n");
22 exit(1);
23 }
24
25 //2.1设置绑定的地址
26 bzero(&server_addr,sizeof(struct sockaddr_in));
27 server_addr.sin_family = AF_INET;
28 server_addr.sin_port = htons(portnum);
29 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
30
31 //2.2绑定地址
32 bind(sockfd, (struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
33
34 //3.监听端口
35 listen(sockfd,5);
36
37 while(1)
38 {
39 //4.等待连接
40 sin_size = sizeof(struct sockaddr);
41 new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
42 printf("server get connection %s\n",inet_ntoa(client_addr.sin_addr));
43
44 //5.接受数据
45 recv(new_fd,buffer,128,0);
46 buffer[nbyte] = '\0';
47 printf("server receive : %s\n",buffer);
48
49 //6.结束连接
50 close(new_fd);
51 }
52 close(sockfd);
53 }

编译运行:gcc tcp_server.c -o tcp_server ---------->./tcp_server

三、编写客户机的代码

touch tcp_client.c

chmod 777 tcp_client.c

代码如下:

 1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <sys/types.h>
5 #include <netinet/in.h>
6
7 #define portnum 3333
8
9 int main()
10 {
11 int sockfd;
12 char buffer[128];
13 struct sockaddr_in server_addr;
14 //1.创建套接字
15 if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
16 {
17 printf("creat socket error!\n");
18 exit(1);
19 }
20 //2.1设置要连接色服务器的地址
21 bzero(&server_addr,sizeof(struct sockaddr_in));
22 server_addr.sin_family = AF_INET;
23 server_addr.sin_port = htons(portnum);
24 server_addr.sin_addr.s_addr = inet_addr("192.168.58.128");
25
26 //2.2连接服务器
27 if (connect(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
28 {
29 printf("connect error! \n");
30 }
31
32 //3.发送数据到服务器
33 printf("please input char:\n");
34 fgets(buffer,128,stdin);
35 send(sockfd,buffer,strlen(buffer),0);
36 //4.关闭连接
37 close(sockfd);
38 return 0;
39 }

编译运行gcc tcp_client.c -o tcp_client-------------->./tcp_client

四、运行结果如下

1.服务器运行进入等待

2.在客户机等待输入的字符中输入字符

3.可以看到服务器收到信息并且打印出来

TCP通讯程序设计---5的更多相关文章

  1. TCP通讯程序设计

    TCP通讯程序设计 这里主要包含客户机和服务器的编程. 一.编程模型函数化 使用函数说明:socket的理解 服务器: 创建socket使用函数----->socket 绑定地址使用函数---- ...

  2. .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)

    上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...

  3. 简单的c# TCP通讯(TcpListener)

      简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TC ...

  4. 基于STM32和W5500的Modbus TCP通讯

    在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...

  5. 使用netty实现的tcp通讯中如何实现同步返回

    在netty实现的tcp通讯中,一切都是异步操作,这提高了系统性能,但是,有时候client需要同步等待消息返回,如何实现呢?笔者已经实现,在此总结下重点要素 实现要点: 1.消息结构设计 消息头中需 ...

  6. C#TCP通讯框架

    开源的C#TCP通讯框架 原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发 ...

  7. UDP通讯程序设计

    UDP通讯程序设计 一.函数化 1.1服务器使用的函数 创建socket----->socket 绑定地址-------->bind 接受数据-------->recvfrom 发送 ...

  8. 推荐一款开源的C#TCP通讯框架

    原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够 ...

  9. ActiveMQ之 TCP通讯机制

    ActiveMQ支持多种通讯协议TCP/UDP等,我们选取最常用的TCP来分析ActiveMQ的通讯机制.首先我们来明确一个概念:  客户(Client):消息的生产者.消费者对ActiveMQ来说都 ...

随机推荐

  1. H5 技术

    1,HTML5预加载标签 <!-- 页面,可以使用绝对或者相对路径 --> <link rel="prefetch" href="page2.html& ...

  2. EF Code-First数据迁移的尝试

    Code-First的方式虽然省去了大量的sql代码,但增加了迁移的操作.尝试如下: 1.首先要在“扩展管理器”里搜索并安装NuGet“库程序包管理器”,否则所有命令都不能识别,会报CommandNo ...

  3. 傅里叶变换:MP3、JPEG和Siri背后的数学

    九年前,当我还坐在学校的物理数学课的课堂里时,我的老师为我们讲授了一种新方法,给我留下了深刻映像.我认为,毫不夸张地说,这是对数学理论发现最广泛的应用.应用的领域包括:量子物理.射电天文学.MP3和J ...

  4. OpenCV之响应鼠标(一):利用鼠标获取坐标

    好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...

  5. pig

    1.Pig是基于hadoop的一个数据处理的框架. MapReduce是使用java进行开发的,Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行.2.Pig的数据处理语言是数据流 ...

  6. Android Studio如何发布APK

    (1)Android Studio菜单Build->Generate Signed APK (2)弹出窗口 (3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密钥(已拥有密钥库跳过)    ...

  7. Listview没有优化之前

    MainActivity.java package com.example.listviewdemo4; import java.util.ArrayList; import java.util.Ha ...

  8. memcpy的用法及实现

    memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest所指内存地址的起始位置. #include <string.h&g ...

  9. struts调用的几种方法

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

  10. SVG 2D入门1 - SVG综述

    位图与矢量图 以前,浏览器中显示的图形,例如jpeg.gif等,都是位图,这些图像格式是基于光栅的.在光栅图像中,图像文件定义了图像中每个像素的颜色值.浏览器需要读取这些值并做出相应行动.这种图像的再 ...