socket相关操作(下)
程序员文章站
2022-04-24 22:16:38
...
创建socket->命名socket->创建监听
4.接受连接
4.1代码:int accept (int sockfd,struct sockaddr addr,socklen_t addrlen);
4.2参数注释
4.2.1 sockfd:执行过李stem系统调用的监听socket
4.2.2 addr:用来获取被接受连接的远程socket地址,长度下一个参数addlen
指定。
4.3返回
成功返回新的socket连接,该socket是唯一标识
失败返回-1并且设置errno
上篇说过的客户端断网的情况,如今补充代码
int main(int argc,char *argv[]){
if(argc<=2){
printf("参数缺少 %s",basename(argv[0]));
return 1;
}
const char *ip=argv[1];
int port = atoi(argv[2]);//atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0[1]
struct sockaddr_in address;
bzero(&address,sizeof(address));//bzero:置字节字符串s的前n个字节为零且包括‘\0’。
adress.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);//inet_ptoi:inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。
adress.sin_port = htons(port);//htons:将整型变量从主机字节顺序转变成网络字节顺序
int sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);//使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。
int ret = bind(sock,{struct sockaddr*} &address,sizeof(address));
assert(ret!=1);
ret = listen(sock,5);
assert(ret!=1);
sleep(20);//等待20秒,用来等待客户端连接和相关操作完成
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
int connfd = accept(sock,{struct sockaddr*} &client,&client_addrlength);
if(connfd <0){
printf("errno:%d",errno);
}else{
char remote[INET_ADDRSTRLEN];
//ip:inet_ntop(AF_INET,&client.sin_addr,remote,INET_ADDRSTRLEN)
//端口:ntohs(client.sin_port)
close(connfd);
}
close(sock);
return 0;
}
./testaccept 192.168.1.109 54321
telnet 192.168.1.109 54321
netstat -nt | grep 54321
5.发起连接
客户端主动链接
5.1 int connect (int sockfd,const struct sockaddr * serv_addr,socklen_t addrlen);
成功返回0
常见错误:ECONNREFUSED:目标端口不存在
···············ETIMEDOUT连接超时
6.关闭连接
int close(int fd);
不是真正的关闭,只是引用减1
真正关闭:int shutdown(int sockfd,int howto);
本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/2067618
推荐阅读
-
Python字典及相关操作(内含例题)
-
在Linux下通过命令行来操作使用Dropbox
-
Windows下Python使用Pandas模块操作Excel文件的教程
-
ES中对索引的相关操作
-
Linux下与文件相关的几个时间的介绍
-
JavaScript类型相关的常用操作总结
-
用Mysql进行emp、dept、salgrade表的相关查询操作
-
在Gnumeric下使用Python脚本操作表格的教程
-
centos7系统下nginx安装并配置开机自启动操作
-
MacOS配置Anaconda3(Miniconda3)下Python3.6、Python3.7和Python2.7环境和基础机器学习、神经网络相关包详解(版本号对应)