先写一个不管是网络编程还是其他编程都很有用的小技巧:
包裹函数:
int Socket(int domain,int type,int protool){
int sockfd;
if((sockfd=socket(domain,type,protool))<0){
perror("socket error!");
exit(1);
}
}
对于包裹函数,最最主要的一点就是等于号的优先级是最低的,所以,要在比较的时候加括号,不然就会出现socket operation on non-socket的报错。这点我深有体会。
好了,现在开始写基础的socket编程;
无论是客户端还是服务器端,首先都要创建一个socket套接字,
socket函数的参数如下:
int socket(int domain,int type,int protool);
第一个参数的含义是表示用的什么协议,基本用的比较多的就是AF_INET和AF_INET6,一个是IPV4,一个是IPV6,还有AF_LOCAL,unix域套接字,AF_ROUTE,路由套接字,AF_KEY,密钥套接字。
第二个参数的含有是表示用的什么类型的套接字,SOCK_STREAM,字节流套接字,SOCK_DGRAM,数据报套接字,SOCK_RAW,原始套接字。SOCK_SEQPACKET有序分组套接字。
一般除非特殊场合,只要前面的设定已经设好了,这个参数基本上就是设0;
然后在服务器端,接下来的操作就是要bind套接字。
bind套接字之前要先设置服务器的sockaddr结构:
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AFNET;
servaddr.sin_addr.s_addr=htonl(INADDRINY);
servaddr.sin_port=htons(PORT);
先清空地址,然后设置第一个是设协议,然后设IP地址,然后设端口。
int bind(int sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
if((bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
perror("bind error!");
exit(1);
}
下面则是bind函数的错误包裹函数。
第一个参数就是套接字,第二个参数是强制转换成sockaddr的sockaddr_in结构的servaddr,第三个参数是
bind完了就是监听,listen紧随其后:
int listen(int sockfd,int bakclog);
第一个参数是套接字,第二个是套接字排队的最大连接数。
然后进入循环等待,accept函数,只要客户端一connect就绪,accept就会接收,连接建立,不然就会一直阻塞在accept函数中,
下面是accept函数:
socklen_t clilen;
clilen=sizeof(cliaddr);
accept(sockfd,(struct sockaddr*)&cliaddr,&clilen);
客户端的关键就是创建socket套接字,不需要绑定,不需要监听,不过要设置服务器端的地址servaddr。然后连接到服务器端:
connect(int sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr);
现在就是连接已经建立好了,当然在accept和connect中还有很多可以讨论,比如说多个客户端,一个服务器,如何accept,如何在listen队列中找出已经就绪的客户端。
然后还有在服务器与客户端之间的发送和接收数据的函数,我放下一篇博客写。