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. MySQL 报错 1055

    具体报错 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'exer.student.sid' w ...

  2. Elasticsearch 安全篇

    为什么要开放外网访问Elasticsearch:1.一些插件监听使用,方便及时了解线上数据的情况,比如说head插件等2.为了HTTP直接访问,有的同学考虑到通过后台TCP查询,然后返回数据,还不如直 ...

  3. [luogu3620][APIO/CTSC 2007]数据备份【贪心+堆+链表】

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  4. centos7/RHEL7最小化系统安装gnome图形界面

    应用场景:对于比较熟悉linux系统的用户来说,全命令行系统可能来的比较简单明了高效,也存在某些情况下需要有像winodws下弹出对话框的情形需求,或者对于初识linux习惯windows界面的用户来 ...

  5. Python使用import导入相对路径的其他py文件

    假如有如下的目录结构 . ├── setup.py ├── main.py ├── mod/ │   └── mod.py └── sub/ └── sub.py 情况1:setup.py导入main ...

  6. 用lemon测交互题

    题目类型:传统. 答案比较类型:逐行比较类型(忽略多余空格和制表符). 配置:交互. 编译器参数: -o %s %s.* ..\..\data\%s\judge.cpp -Wl,--stack= ju ...

  7. [模板]ETT

    解:splay维护括号序列,就是进子树一次出子树一次.树上每个点直接记录这两个点的编号. 建树的时候按照分配的编号建树. #include <bits/stdc++.h> typedef ...

  8. 利用twilio进行手机短信验证

    首先要注册 twilio 账号但是由于twilio人机验证用的是Goole所有注册需要FQ 完成后去免费获取15元使用 然后 pip install twilio 注册完成后会在个人首页显示你的免费金 ...

  9. mybatis 的批量更新操作sql

    转: mybatis 的批量更新操作sql 2018年07月23日 10:38:19 海力布 阅读数:1689   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  10. mybatis源码分析(方法调用过程)

    十一月月底,宿舍楼失火啦,搞得20多天没有网,目测直到放假也不会来了... 正题 嗯~,其实阅读源码不是为了应付面试,更重要的让你知道,大师是怎样去写代码的,同样是用Java,为啥Clinton Be ...