伯克利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 调用接口)基础 ...
随机推荐
- Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)
Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...
- U盘启动盘还原
cmd运行 diskpart list disk clean 一般都是disk 1,不过最好先list查一下 右击桌面上的计算机图标,选择管理,进入磁盘管理,能看到u盘分区是未分配的(黑色),右击,新 ...
- 【HDU - 4340】Capturing a country(树形DP)
BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ...
- SAM练习记录
SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时 ...
- poj 1733 Parity game(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...
- css border 三角形
当元素的宽高都为0时,只写border,就会发现形成的正方形有4个三角形组成. .triangle { width: 0px; height: 0px; border: 20px solid tran ...
- QML学习笔记(七)— 实现可拖拽、编辑、选中的ListView
鼠标单击可选中当前项,头部呈绿色显示:按压当前项可进行拖拽更换列表项位置:点击数据可以进行编辑: GitHub:八至 作者:狐狸家的鱼 这里是自己定义的model,有些字体和颜色都是使用的全局属性, ...
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一 ...
- Elastic 开发篇 javaAPI(4)
1.解决精确匹配问题,如果不加配置,搜索农大,会搜出“农”“大”这两个字的匹配,我们要的是“农大”,那么好了,加上一个条件搞定: MatchQuery.Type.PHRASE 完整代码: packag ...
- TCP多线程聊天室
TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...