TCP通讯模型简单示例

时间:2021-10-05 01:19:42

1. TCP通讯模型

TCP通讯模型简单示例

2. 服务器端

① 创建socket,用函数socket()

② 绑定IP地址、端口号等信息到socket上,用函数bind()

③ 设置允许的最大连接数,用函数listen()

④ 等待来自客户端的连接请求,用函数accept()

⑤ 收发数据,用函数send()和recv(),或者read()和write()

⑥ 关闭网络连接,用函数close()

3. 客户端

① 创建一个socket,用函数socket()

② 设置要连接的服务器的IP地址和端口的属性

③ 连接服务器,用函数connect()

④ 收发数据,用函数send()和recv(),或者read()和write()

⑤ 关闭网络连接,用函数close()

4. 简单示例

① 服务器端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h> #define portnumber 3333 int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[]; /* 服务程序建立sockfd描述符 */
if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -) // AF_INET:IPV4;SOCK_STREAM:TCP
{
fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
exit();
} bzero(&server_addr, sizeof(struct sockaddr_in)); // 初始化,置0 server_addr.sin_family = AF_INET; // Internet
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上
//INADDR_ANY 表示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上
//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip server_addr.sin_port = htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号 /* 捆绑sockfd描述符到IP地址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
exit();
} /* 设置允许连接的最大客户端数 */
if(listen(sockfd, ) == -)
{
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
exit();
} while()
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit();
} fprintf(stderr, "Server get connection from %s\n", inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串
if((nbytes = read(new_fd, buffer, )) == -)
{
fprintf(stderr, "Read Error:%s\n", strerror(errno));
exit();
} buffer[nbytes] = '\0';
printf("Server received %s\n",buffer); /* 这个通讯已经结束 */
close(new_fd);
/* 循环下一个 */
} /* 结束通讯 */
close(sockfd);
exit();
}

② 客户端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h> #define portnumber 3333 int main(int argc, char *argv[])
{
int sockfd;
char buffer[];
struct sockaddr_in server_addr;
struct hostent *host; if(argc != )
{
fprintf(stderr, "Usage:%s hostname \a\n", argv[]);
exit();
} /* 使用hostname查询host名字 */
if((host = gethostbyname(argv[])) == NULL)
{
fprintf(stderr, "Gethostname error\n");
exit();
} /* 客户程序建立sockfd描述符 */
if((sockfd = socket(AF_INET,SOCK_STREAM,)) == -) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
exit();
} /* 客户程序填充服务端的资料 */
bzero(&server_addr, sizeof(server_addr)); // 初始化,置0 server_addr.sin_family = AF_INET; // IPV4
server_addr.sin_port = htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr = *((struct in_addr *)host->h_addr); // IP地址 printf("host->h_addr = 0x%x\n", *((struct in_addr *)host->h_addr));
printf("server_addr.sin_addr = 0x%x\n", server_addr.sin_addr); /* 客户程序发起连接请求 */
if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr))==-)
{
fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
exit();
} /* 连接成功了 */
printf("Please input char:\n"); /* 发送数据 */
fgets(buffer, , stdin); write(sockfd, buffer, strlen(buffer)); /* 结束通讯 */
close(sockfd);
exit();
}

TCP通讯模型简单示例的更多相关文章

  1. UDP通讯模型简单示例

    1. UDP通讯模型 2. 服务器端 ① 创建一个socket,用函数socket() ② 绑定IP地址.端口等信息到socket上,用函数bind() ③ 循环接收数据,用函数recvfrom() ...

  2. SharePoint 2010 -- Silverlight托管客户端模型简单示例

    Silverlight托管客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverli ...

  3. SharePoint 2010 -- &period;Net托管客户端模型简单示例

    .Net托管客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight&quo ...

  4. SharePoint2010 -- ECMAScript客户端模型简单示例

    ECMAScript客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight ...

  5. TCP并发服务器简单示例

    并发服务器的思想是每一个客户的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理 1. 服务器端 #include <stdio.h> #include <sys/types ...

  6. Linux 下 简单客户端服务器通讯模型&lpar;TCP&rpar;

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  7. SignalR代理对象异常:Uncaught TypeError&colon; Cannot read property &&num;39&semi;client&&num;39&semi; of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  8. Linux单用户CS模型TCP通讯完全注释手册

    Linux单用户CS模型TCP通讯完全注释手册 server 描述 实现一个简单的Linux单用户CS通讯,客户端发送一串字符串,服务器将其转换为大写后返回. server 代码 ``` #inclu ...

  9. 简单的c&num; TCP通讯(TcpListener)

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

随机推荐

  1. 终于遇到app不兼容,你遇到了么?

    题记: 如果支付宝和QQ不兼容,要二选一,你会怎么选择? 首先了解一下背景: 笔者最近发现,微众银行的app升级到1.7.4, 而患有轻度强迫症的人是迫不及待的点了升级. 第一次,居然安装包安装不成功 ...

  2. 【C&num;】DataRowState演变备忘

    环境:.net 2.0 DataRow的行状态一段时间不用就会吃不准,记录一下,备查. DataRowState 演变表 行属于如下状态时进行右边操作→ 后的状态演变 添加到表 dt.Rows.Add ...

  3. iOS - OC Copy&Tab;&Tab;拷贝

    前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...

  4. CodeIgniter&lpar;CI 3&period;0&rpar;分页类实践记录

    最近在学习B/S,选择了PHP CI框架作为切入点. 在尝试制作个人CMS的时候遇到了需要分页的情况,网上好像搜不到3.0版本以上的例子,下面附上本地实验的代码,供参考. 数据库情况如下: 首先看Co ...

  5. codeforces 685B Kay and Snowflake 树的重心

    分析:就是找到以每个节点为根节点的树的重心 树的重心可以看这三篇文章: 1:http://wenku.baidu.com/link?url=yc-3QD55hbCaRYEGsF2fPpXYg-iO63 ...

  6. Django初学笔记1&period;

    1,安装python 和 Django , 参考网上教程(安装python,配置path, 安装django,配置path..) 2,查看django安装版本:cmd-->python--&gt ...

  7. 整合SSH三大框架用注解时报An AnnotationConfiguration instance is required to use

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 's ...

  8. &period;NET CORE 中使用AutoMapper进行对象映射

    简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMappe ...

  9. Confluence 6 系统运行信息中的 JVM 内存使用情况

    当前一个正在运行的 Confluence 6 实例的内存使用情况 https://www.cwiki.us/display/CONF6ZH/Viewing+System+Information

  10. ES系列十三、Elasticsearch Suggester API&lpar;自动补全)

    1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...