一、用AF_UNIX,进行进程间的通信;
/*server1.c*/
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
int server_fd,client_fd;
struct sockaddr_un myaddr;
struct sockaddr_un clientaddr;
myaddr.sun_family=AF_UNIX;
strcpy(myaddr.sun_path,"mysocketfile");
int clientaddr_len=sizeof(clientaddr);
server_fd=socket(AF_UNIX,SOCK_STREAM,0); //2.建立套接字;
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1) //2.绑定;
{
perror("bind error");
exit(1);
}
if(listen(server_fd,20)==-1) //3.监听端口;
{
perror("listen error");
exit(1);
}
printf("listening...\n");
client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);//4.堵塞并接收客户端的信息;
if(client_fd==-1)
{
perror("accept error");
exit(1);
}
printf("accept client\n");
write(client_fd,"hello world",11);//5.进行读和写;
close(client_fd);
close(server_fd);
}
/*client1.c*/
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main()
{
int server_fd;
char buf[100];
struct sockaddr_un myaddr;
myaddr.sun_family=AF_UNIX;
strcpy(myaddr.sun_path,"mysocketfile");
server_fd=socket(AF_UNIX,SOCK_STREAM,0); //1.建立socket套接字;
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)//2.连接connext.
{
perror("connet error");
exit(1);
}
read(server_fd,buf,100); //3.读或写
printf("get msg is:%s\n",buf);
close(server_fd);
}
二、用AF_INET,进行网络操作;
/*server2.c*/
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
int main()
{
int server_fd,client_fd;
struct sockaddr_in myaddr;
struct sockaddr_in clientaddr;
myaddr.sin_family=AF_INET;//family是协议族的意思;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);/*如果要接收来自指定的IP地址的客户
端的话,就要把INADDR_ANY改成IP地址即可。这里接收来自任何地址的客户端;*/
myaddr.sin_port=htons(8080);/*由于网络传输是通过二进制进行传输的,所以要转>换为网络字节顺序*/
int clientaddr_len=sizeof(clientaddr);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
{
perror("bind error");
exit(1);
}
if(listen(server_fd,20)==-1)
{
perror("listen error");
exit(1);
}
printf("listening...\n");
client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);
if(client_fd==-1)
{
perror("accept error");
exit(1);
}
printf("accept client\n");
write(client_fd,"hello world",11);
close(client_fd);
close(server_fd);
}
/*clien2.c*/
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
int main()
{
int server_fd;
char buf[100];
struct sockaddr_in myaddr;
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
myaddr.sin_port=htons(8080);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
{
perror("connet error");
exit(1);
}
read(server_fd,buf,100);
printf("get msg is:%s\n",buf);
close(server_fd);
}
三、循环接受客户端请求
只需在accept到close(client_fd)加入循环结构即可;
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
int main()
{
int server_fd,client_fd;
struct sockaddr_in myaddr;
struct sockaddr_in clientaddr;
myaddr.sin_family=AF_INET;//family是协议族的意思;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);/*如果要接收来自指定的IP地址的客户
端的话,就要把INADDR_ANY改成IP地址即可。这里接收来自任何地址的客户端;*/
myaddr.sin_port=htons(8080);/*由于网络传输是通过二进制进行传输的,所以要转>换为网络字节顺序*/
int clientaddr_len=sizeof(clientaddr);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
{
perror("bind error");
exit(1);
}
if(listen(server_fd,20)==-1)
{
perror("listen error");
exit(1);
}
printf("listening...\n");
while(1)
{
client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);
if(client_fd==-1)
{
perror("accept error");
exit(1);
}
printf("accept client\n");
write(client_fd,"hello world",11);
close(client_fd);
}
close(server_fd);
}
四、不通过IP来请求服务器,而是通过hostname来请求;
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<netinet/in.h>
int main(int argc,char *argv[])
{
if(argc<2)
{
perror("argcument error");
exit(1);
}
int server_fd;
struct hostent *myhost;
char buf[100];
struct sockaddr_in myaddr;
myaddr.sin_family=AF_INET;
myhost=gethostbyname(argv[1]);
if(!myhost)
{
perror("gethost error");
exit(1);
}
myaddr.sin_addr=*((struct in_addr *)myhost->h_addr);
myaddr.sin_port=htons(8080);
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(1);
}
if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
{
perror("connet error");
exit(1);
}
read(server_fd,buf,100);
printf("get msg is:%s\n",buf);
close(server_fd);
}