socket客户端编程的基本步骤:
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('
',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
",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
**
克隆本项目:
gitclone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL02