1 网络编程API

(1)网络层的ip地址可以唯一标识网络中的主机,传输层通过协议+端口唯一标识主机中的应用程序。这样以来使用三元组(地址,协议,端口)标识网络的进程。

(2)socket--->插槽(低俗的哈哈哈哈),看作文件描述符,Linux基本哲学一切皆文件,那么是不是也可以读写关闭这样的习惯性操作呢。对了,差不多的啦。

(3)来看看tcp交互流程

ok具体看看各个函数

第一个:int socket(int domain,int type,int protocol)

参数介绍:

domain:协议域,决定了socekt地址类型

type:socket类型.

protocol:指定协议。

调用这个函数返回的socket描述符就在协议族的空间中,但是没有一个具体的地址,所以咱们给予它地址就有勒bind

第二个:int bind(int socketfd,const struct sockaddr *addr,socklen_t addrlen)

参数介绍

addr:指向半丁给sockfd的协议地址。根据创建socekt时的地址协议族的不同而不同

第三个和第四个:listen connect

监听 客户端呢就链接撒

第五个:accept

当客户端发送了链接请求以后,就开始接受。都接受了就可以开始交流了嘛---->进行io操作。

注意:accept成功,返回值由内核自动生成一个新的描述符哦。

第六个,第六组吧

read() write()

recv() send()

readv() writev()

recvmsg() sendmsg()

recvfrom() sendto()

read读取成功会放回实际读取的字节数。0标识读到我呢见的末尾。

2 来一个例子

 //client.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define MAXLINE 4096 int main(int argc, char** argv){
int sockfd, n;
char recvline[4096], sendline[4096];
struct sockaddr_in servaddr; if( argc != 2){
printf("usage: ./client <ipaddress>\n");
return 0;
} if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
return 0;
} memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s\n",argv[1]);
return 0;
} if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
} printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0){
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
return 0;
}
close(sockfd);
return 0;
}
 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h> #define MAXLINE 4096 int main(int argc, char** argv){
int listenfd, connfd;//这里有两个 一个是创建套接字描述符 一个是建立连接后的描述符哈
struct sockaddr_in servaddr;
char buff[4096];
int n; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
} memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666); if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
} if( listen(listenfd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
} printf("======waiting for client's request======\n");
while(1){
if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
n = recv(connfd, buff, MAXLINE, 0);
buff[n] = '\0';//注意了 要输出字符串 后面加上这个玩意哦
printf("recv msg from client: %s\n", buff);
close(connfd);
}
close(listenfd);
return 0;
}
 all:server client
server:server.o
g++ -g -o server server.o
client:client.o
g++ -g -o client client.o
server.o:server.cpp
g++ -g -c server.cpp
client.o:client.cpp
g++ -g -c client.cpp
clean:all
rm all

先运行./server 然后./client 127.0.0.1如下图所示

ok 热身下了,什么字节序之类的下一篇在总结勒。加油。。。。

最新文章

  1. 个人理解c#对称加密 非对称加密 散列算法的应用场景
  2. 神秘常量复出!用0x077CB531计算末尾0的个数 -- De Bruijn 序列
  3. 利用Asio搭建日志系统
  4. Thinking in scala (7)---- f(n)=f(n-1)+2f(n-2)+3f(n-3)
  5. Mongodb基础用法及查询操作[转载]
  6. 面试题1 -- Java 中,怎么在格式化的日期中显示时区?
  7. 三种方法运行python
  8. Java基础(二)-static关键字分析
  9. HBase、MongoDB、cassandra比较
  10. 泡泡一分钟:Stabilize an Unsupervised Feature Learning for LiDAR-based Place Recognition
  11. Docker 入门指南——资源工具篇
  12. git使用之放弃本地修改
  13. ExportGrid Aspose.Cells.dll
  14. IE浏览器如何调试Asp.net的 js代码
  15. 【WIN10】移植opencc到WIN10-UWP,實現自己的繁簡轉換工具
  16. neo4j 常用命令查询,以及更新 节点 的 label 名 和 property 名
  17. Java多线程(汇聚页)
  18. python-json.loads()保持原json字符串的顺序
  19. MongoCola使用教程 2 - MongoDB的Replset 初始化和配置
  20. js 清空 input[type=file]的值

热门文章

  1. AngularJS 实现 双击排序
  2. Java的泛型约束和限制
  3. [Python爬虫] Selenium自己主动訪问Firefox和Chrome并实现搜索截图
  4. 【BZOJ3505】[Cqoi2014]数三角形 组合数
  5. 九度OJ 1129:Skew数 (大数运算)
  6. Jsp中操作页面显示
  7. windows server安装oracle
  8. js 单例模式的实现方式----闭包和构造函数内部判断
  9. Appium——WebDriverException: Message: A new session could not be created.
  10. 【mysql】mysql innodb 配置详解