伯克利SocketAPI(一) socket的C语言接口/最简单的服务器和对应的客户端C语言实现
1. 头文件

2. API函数


3. 最简单的服务器和对应的客户端C语言实现
3.1 server
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> int main(int argc, char** argv)
{
char hello[] = "hello world";
struct sockaddr_in sa; int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (- == SocketFD)
{
perror("cannot create socket"); //鎵撳嵃浠€涔堝師鍥犲嚭閿?
exit(EXIT_FAILURE); //
} memset(&sa, , sizeof(sa)); //c鐨勪範鎯? 鏄剧ず鍒濆鍖?
//瀹氫箟浜唅p鍦板潃鍜岀鍙e彿
sa.sin_family = AF_INET;
sa.sin_port = htons(); //htons鎶婃搷浣滅郴缁熺殑瀛楄妭搴忥紝杞寲涓虹綉缁滅殑瀛楄妭搴?==> Linux涓婂皬绔?->澶х
sa.sin_addr.s_addr = htonl(INADDR_ANY); //缁戝畾绔彛鍙?
//澶辫触: 宸茬粡缁戝畾锛屾垨鑰呭皬浜?024鐨勭鍙?闇€瑕佹潈闄?
if (- == bind(SocketFD, (struct sockaddr*)&sa, sizeof(sa)))
{
perror("bind failed");
exit(EXIT_FAILURE);
} //鐩戝惉, 10:鍚庨潰鍐嶈
if (- == listen(SocketFD, ))
{
perror("accept failed\n");
close(SocketFD);
exit(EXIT_FAILURE);
} //鏈嶅姟鍣ㄥ紑濮嬪伐浣? accept:鎺ユ敹涓€娆′笁娆℃彙鎵嬫垚鍔熺殑瀹㈡埛绔繛鎺?
for (;;)
{
int ConnectFD = accept(SocketFD, NULL, NULL); if ( > ConnectFD)
{
perror("accept failed");
exit(EXIT_FAILURE);
} int writeSize = ;
size_t totalWrite = ;
while (totalWrite < sizeof(hello))
{
writeSize = write(ConnectFD, hello + totalWrite, sizeof(hello) - totalWrite);
if (- == writeSize)
{
perror("write failed");
close(ConnectFD);
close(SocketFD);
exit(EXIT_FAILURE);
}
totalWrite += writeSize;
} if (- == shutdown(ConnectFD, SHUT_RDWR))
{
perror("shutdown failed\n");
close(ConnectFD);
close(SocketFD);
exit(EXIT_FAILURE);
} close(ConnectFD); } close(SocketFD); return EXIT_SUCCESS; }
3.2 client
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> int main(int argc, char *argv[])
{
struct sockaddr_in sa;
int res;
//tcp
int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //资源不够
if (- == SocketFD)
{
perror("cannot create socket");
exit(EXIT_FAILURE);
} //初始化sa
memset(&sa, , sizeof(sa)); //设置连接服务器的 ip和端口号
sa.sin_family = AF_INET;
//端口号2222, htons把操作系统的字节序,转化为网络的字节序
sa.sin_port = htons();
//连接本地ip地址
res = inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); //客户端,设置连接服务器
//失败,则释放资源
if (- == connect(SocketFD, (struct sockaddr*)&sa, sizeof(sa)))
{
perror("connect failed\n");
close(SocketFD);
exit(EXIT_FAILURE);
} char buffer[];
int totalRead = ;
for (;;)
{
int readSize = ;
readSize = read(SocketFD, buffer + totalRead, sizeof(buffer) - totalRead);
if (readSize == )
{
//read all
break;
}
else if (readSize == -)
{
perror("read failed");
close(SocketFD);
exit(EXIT_FAILURE);
} char buffer[];
int totalRead = ;
for (;;)
{
int readSize = ;
readSize = read(SocketFD, buffer + totalRead, sizeof(buffer) - totalRead);
if (readSize == )
{
//read all
break;
}
else if (readSize == -)
{
perror("read failed");
close(SocketFD);
exit(EXIT_FAILURE);
} totalRead += readSize;
} buffer[totalRead] = ;
printf("get from server: %s\n", buffer);
/* perform read wirte operations ...*/ (void)shutdown(SocketFD, SHUT_RDWR); close(SocketFD); return EXIT_SUCCESS; }

当服务器主动关闭连接的时候,会出现 TIME_WAIT状态(哪一边主动关闭连接,TIME_WAIT发生在哪一边)

伯克利SocketAPI(一) socket的C语言接口/最简单的服务器和对应的客户端C语言实现的更多相关文章
- socketAPI:一个最简单的服务器和对应的客户端C语言的实现
基于linux,该实例实现了服务端传了一个hello world给客户端.socket()创建socketbind()绑定socket到IP地址和端口listen()服务器监听客户端的连接connec ...
- C/C++编程日记:用C语言实现的简单Web服务器(Linux),全代码分享!
相信大家对Apache都有所听闻,Apache是目前使用最为广泛我Web服务器.大家可以从news.netcraft.com/这个网站得到证实. 这是腾讯的uptime.netcraft.com/up ...
- opencv的C语言接口和C++接口差别(入门篇)
opencv是一个开源的图像处理库,最经典的1.0版本号提供的接口都是C语言接口. 后来的opencv2.x版本号保留了C语言接口,可是提供了C++接口,当中的C语言接口仅仅是为了向后兼容,而C++接 ...
- 用Go语言实现一个简单的聊天机器人
一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...
- 07. Go 语言接口
Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法
由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...
- C语言接口与实现实例
一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实 ...
- [转]SQLITE3 C语言接口 API 函数简介
SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...
- 基于Oracle OCI的数据访问C语言接口ORADBI .
基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008 ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...
随机推荐
- bzoj 1452: [JSOI2009]Count (二维树状数组)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1452 思路: 对每个颜色开一个二维树状数组维护就好了 实现代码: #include<b ...
- luogu P2680 运输计划 (二分答案+树上差分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- jwt实现
<?phpnamespace app\admin\controller;use think\Config;use think\Controller;use think\Request;use t ...
- 【BZOJ2034】最大收益(贪心)
[BZOJ2034]最大收益(贪心) 题面 BZOJ 题解 首先显然让价值越大的占用一个时刻一定更优. 所以把所有东西按照价值排序之后来处理,那么显然就是把前面的全部放好之后,考虑来放当前这个东西,如 ...
- 【转】IAR Embedded Workbench for ARM 8.22.1 基础使用教程
@2018-12-15 [小记] IAR Embedded Workbench for ARM 8.22.1 基础使用教程
- PID 通俗解释
PID 控制原理3 个故事:看完您就明白了.1.: PID 的故事小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就 ...
- 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)
1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...
- 搭建james邮件服务器
把james解压到任何一个非中文无空格目录下: lib下添加必要的jar文件: 运行run.bat命令服务器,使用期间不要关闭. 创建邮件数据库 创建配置文件:james-database.prope ...
- 解题:NOI2018 你的名字(68pts暴力)
题面 rt,如果省选没退役就补 SAM的优势:简单明了 先建S的SAM并标记所有节点,之后每次询问直接把T按广义SAM的方法插上去,统计新加的节点到根的状态代表的本质不同子串数,减掉被标记的部分就是T ...
- 洛谷P2805 植物大战僵尸
题意:给你一张图,每个节点保护若干节点. 当一个节点不被保护的时候,你就可以gay掉它. gay每个节点都有收益(可能为负),求最大总收益. 解:首先发现是一个最大权闭合子图. 把保护关系变成被保护, ...