网络编程(2)—— 基于linux系统的socket客户端编程步骤
2016-02-09 19:42
741 查看
socket客户端编程的基本步骤:
domain--协议簇,常用的有AF_INET(基于IPV4的Internet协议),AF_INET6(基于IPv6的Internet协议),AF_LOCAL(Unix本地通信协议)
type--传输类型,常用的有SOCK_STREAM(面向连接的可靠的带连接的传输方式,如TCP),SOCK_DGRAM(面向消息的不可靠的雾连接的传输方式,如UDP)
protocal--指定协议,在前面两个参数确定的情况下,若存在多种协议满足条件,用来指定某个协议,通常为0
返回值--socket文件操作符
sockfd--socket操作符
addr--包含了服务器端地址信息的sockaddr类型的结构体指针
addrlen--上述结构体的大小
返回值--返回0表示连接成功,返回-1表示连接失败
fd--socket文件操作符
buf--存放读取的数据的buffer
count--buffer的长度
返回值--返回实际督导的字节数
sockfd--socket文件操作符
示例代码clnt.c:
结合本专栏第一篇博文《网络编程(1)—— 基于linux系统的socket服务器端编程步骤》,分别编译服务端代码和客户端代码,就可以实现服务端和客户端的通信了。
编译serv.c并执行程序,采用9190端口:
编译clnt.c并执行程序,连接环回地址和9190端口:
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL02
1.1 创建套接字
int socket(int domain,int type,int protocol);domain--协议簇,常用的有AF_INET(基于IPV4的Internet协议),AF_INET6(基于IPv6的Internet协议),AF_LOCAL(Unix本地通信协议)
type--传输类型,常用的有SOCK_STREAM(面向连接的可靠的带连接的传输方式,如TCP),SOCK_DGRAM(面向消息的不可靠的雾连接的传输方式,如UDP)
protocal--指定协议,在前面两个参数确定的情况下,若存在多种协议满足条件,用来指定某个协议,通常为0
返回值--socket文件操作符
1.2 连接服务器端
int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);sockfd--socket操作符
addr--包含了服务器端地址信息的sockaddr类型的结构体指针
addrlen--上述结构体的大小
返回值--返回0表示连接成功,返回-1表示连接失败
1.3 读取服务器端数据
ssize_t read(int fd,void* buf,size_t count);fd--socket文件操作符
buf--存放读取的数据的buffer
count--buffer的长度
返回值--返回实际督导的字节数
1.4 关闭socket
close(int sockfd);sockfd--socket文件操作符
示例代码clnt.c:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<arpa/inet.h> #include<string.h> #include<sys/socket.h> void error_handling(char* message) { fputs(message,stderr); fputc('\n',stderr); exit(1); } int main(int argc,char* argv[]) { int sock; struct sockaddr_in serv_addr; char message[30]; int str_len; sock=socket(PF_INET,SOCK_STREAM,0); if(sock==-1) error_handling("socket error"); memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=inet_addr(argv[1]); serv_addr.sin_port=htons(atoi(argv[2])); if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) error_handling("connect error"); str_len=read(sock,message,sizeof(message)); if(str_len==-1) error_handling("read error"); printf("the message from server: %s\n",message); close(sock); return 0; }
结合本专栏第一篇博文《网络编程(1)—— 基于linux系统的socket服务器端编程步骤》,分别编译服务端代码和客户端代码,就可以实现服务端和客户端的通信了。
编译serv.c并执行程序,采用9190端口:
hyman@hyman-VirtualBox:~/projects/NetDevelopment$ gcc serv.c -o serv hyman@hyman-VirtualBox:~/projects/NetDevelopment$ ./serv 9190
编译clnt.c并执行程序,连接环回地址和9190端口:
hyman@hyman-VirtualBox:~/projects/NetDevelopment$ gcc clnt.c -o clnt hyman@hyman-VirtualBox:~/projects/NetDevelopment$ ./clnt 127.0.0.1 9190 the message from server: hello world!
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL02
相关文章推荐
- Android开发笔记(六十)网络的检测与连接
- 基于TCP的网络聊天程序
- TCP协议与UDP协议的区别
- 详解AngularJS中的http拦截
- Linux C TCP Programming example
- Unix网络编程:I/O复用
- 线程同步、网络部分
- linux运行级别[转自网络]
- http://browniefed.com/blog/2015/09/10/the-shapes-of-react-native/
- 详解AngularJS中的http拦截
- IOS-网络(文件上传)
- http://www.google.com/ncr 谷歌无限制搜索方法,用过都说好
- AngularJS中的http拦截
- restlet 2.3.5 org.restlet包导入eclipse出现的com.sun.net.httpserver类包找不到问题
- lighttpd-1.4.39 : watcher and worker
- [置顶] 利用django和python构建网络运维平
- JAVA网络编程TCP案例
- 2016年网络SEO外链指南
- C++自制Redis数据库(四) 设计开始 敲定各模块架构--网络模块
- https原理及tomcat配置https方法