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语言实现的更多相关文章

  1. socketAPI:一个最简单的服务器和对应的客户端C语言的实现

    基于linux,该实例实现了服务端传了一个hello world给客户端.socket()创建socketbind()绑定socket到IP地址和端口listen()服务器监听客户端的连接connec ...

  2. C/C++编程日记:用C语言实现的简单Web服务器(Linux),全代码分享!

    相信大家对Apache都有所听闻,Apache是目前使用最为广泛我Web服务器.大家可以从news.netcraft.com/这个网站得到证实. 这是腾讯的uptime.netcraft.com/up ...

  3. opencv的C语言接口和C++接口差别(入门篇)

    opencv是一个开源的图像处理库,最经典的1.0版本号提供的接口都是C语言接口. 后来的opencv2.x版本号保留了C语言接口,可是提供了C++接口,当中的C语言接口仅仅是为了向后兼容,而C++接 ...

  4. 用Go语言实现一个简单的聊天机器人

    一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...

  5. 07. Go 语言接口

    Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...

  6. Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

    由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...

  7. C语言接口与实现实例

    一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实 ...

  8. [转]SQLITE3 C语言接口 API 函数简介

    SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...

  9. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

随机推荐

  1. php+redis配置

    系统环境: win10+phpstudy+lamp 安装扩展 php5.6.4 =>下载地址:http://windows.php.net/downloads/pecl/releases/red ...

  2. SuperSocket 案例

    SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作 ...

  3. 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)

    洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...

  4. [2017-7-28]Android Learning Day6

    常用控件 Spinner DatePickerDialog TimePickerDiaog RadioButton CheckBox spinner(下拉菜单) <Spinner android ...

  5. [NOI2005]月下柠檬树(计算几何+积分)

    题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...

  6. 借助baidu的jsonp接口,做一个自己的候选词组件

    先观察 对接口进行提炼:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词&cb=回调函数 简单测试一下: <!DOC ...

  7. 微信小程序框架——wepy使后感

    更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...

  8. 洛谷P4319 变化的道路

    题意:给定图,每条边都有一段存在时间.求每段时间的最小生成树. 解:动态MST什么毒瘤...洛谷上还是蓝题... 线段树分治 + lct维护最小生成树. 对时间开线段树,每条边的存在时间在上面会对应到 ...

  9. 【洛谷P4878】布局

    题目大意:给定一个长度为 N 的递增序列,有 M 组差分约束关系,求满足这些约束关系时,第一个数和第 N 个数的差是多少. 题解:首先,能否满足约束关系需要判断一下负环,若满足约束关系,再从第一个点 ...

  10. css实现文本溢出显示省略号

    看到很多网站上的文章列表只显示一部分,之后就是一个阅读全文链接,或者是以一个省略号结尾.今天就说说单行文本,多行文本溢出时怎么显示省略号? 单行 overflow: hidden; white-spa ...