网络编程之前看过一些,今天下午闲来无事,写了几个简单的socket套接字程序来try一下,体验一下网络编程的乐趣.^_^
在网络高速发展的今天,我觉得作为一个IT人,网络编程因该是有点小了解的,PS,我也是刚开始看哈。。。。。
Socket编程的是实现网络上主机之间通信的一种方式,其实实现起来还是挺简单的。写了一小段代码,如下:
---------------------------------------------------------Server.c------------------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
int main()
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
/*Delete the exitence socket,then recreate a new socket*/
unlink("server_socket");
server_sockfd = socket(AF_UNIX,SOCK_STREAM,0);
/*Name the socket*/
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
/*create a socket link list*/
listen(server_sockfd,5);
while(1)
{
char ch;
printf("server waiting\n");
/*accept a socket link*/
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
/*exchange data*/
read(client_sockfd,&ch,1);
ch++;
write(client_sockfd,&ch,1);
close(client_sockfd);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------Client.c--------------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch='A';
/*create a socket for client*/
sockfd = socket(AF_UNIX,SOCK_STREAM,0);
/*Name the socket depend on the server*/
address.sun_family = AF_UNIX;
strcpy(address.sun_path,"server_socket");
len = sizeof(address);
/*link our socket to the server socket*/
result = connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1)
{
perror("oops:client1");
exit(1);
}
/*Send data*/
printf("Send Char:");
scanf("%c",&ch);
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("Char from server = %c \n",ch);
close(sockfd);
exit(0);
}
------------------------------------------------------------------------------------------------------------------------------------------------
源代码编译完成生成对应的client和server可执行目标文件,然后在两个窗口分别运行即可。也可以设置服务端后台运行./server &
运行后客户端发起一个套接字连接请求,服务端的监听程序监听到申请后建立一个和客户端的套接字连接,之间可以开始传输信息。
通过这部分,对socket了解比较深入,套接字有几个比较重要的属性,这是编程中的关键地方:套接字的域,套接字的类型,套接字协议。
1.套接字的域:指套接字通讯中使用的网络介质,最长见的是AF_UNIX和AF_INET前者本地文件类型的套接字传输类型,后者为internet网络传输类型,整个套接字的地址类型其实和文件操作非常的相似,实际上套接字的实现我们可以理解为分布式的文件操作,本程序运行时我们可以看到在当前目录下存在一个server_socket文件,通过file socket_server 命令我们可以看到这是一个socket套接字文件。深意大家可以仔细阅读一下相关方面的书籍。
2.套接字的类型:分为Stream和Datagram两种类型,前者是流套接字,后者是数据报套接字,stream提供一个可靠的,有序的,双向的字节流连接--TCP。datagram提供的是一个不建立连接的数据传输,UDP,但是效率和速度也快。
3.套接字协议:默认是0,具体更改的话可以参考函数的参数类型,man是一个很有帮助的东西!!
----------------------------------------------------->
在套接字程序中另一个需要注意的地方就是套接字“地址格式”,不同的套接字可能地址的长度不一,这在连接的时候会存在一定的麻烦,所以我们需要进行一定的处理,保持地址的有效可用,Linux规定地址为最大108个字符,不同的系统可能规定不一。当地址长度超过这个最大值后会自动截断。
套接字创建后会调用一个绑定函数 bind(server_sockfd,(struct sockaddr *)&server_address,server_len);,把对应的地址分配给关联的未命名的套接字,地址长度由事先求出的值制定。
服务端开启一个监听队列,listen(int socket,int Max_num);这个队列设定了可以最大相应的套接字请求数目,超过最大响应数目后服务器将忽略连接请求。
服务端通过client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);来接受连接请求,并且建立通信连接。
客户端通过 result = connect(sockfd,(struct sockaddr *)&address,len);发起连接。
上述的几种函数都可能存在无法响应的情况,错误码会存储在errno中,可以判断从而更好设计我们的程序,来保持程序的健壮行和提示的友好性。
好了,其实内容还有很多,想写的太多,后续跟进吧!!!Go on.....