代码中注释已写的很详细,就不多言了
注意事项
- 保证套接字文件在同一个目录下
- 网络套接字与本地套接字使用的结构体不同
- 网络套接字采用的结构体为
struct sockaddr_in
- 本地套接字采用的结构体为
struct sockaddr_un
服务端
offsetof
宏函数原型
#define offsetof(type,member) ((int)&((type*)0)->MEMBER
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stddef.h>
#include <sys/un.h>
#include <unistd.h>
#include <ctype.h>
#define SERVFILENAME "/home/server.socket"
int main()
{
int sfd = socket(AF_UNIX,SOCK_STREAM,0);
struct sockaddr_un serv_addr;
bzero(&serv_addr,sizeof (serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,SERVFILENAME);
int len = offsetof(struct sockaddr_un,sun_path)+strlen(serv_addr.sun_path);
unlink(SERVFILENAME);
bind(sfd,(struct sockaddr*)&serv_addr,len);
listen(sfd,20);
struct sockaddr_un clie_addr;
printf("accept..........\n");
int readlen = 0;
char buf[BUFSIZ];
while (1) {
len = sizeof (clie_addr);
int cfd = accept(sfd,(struct sockaddr*)&clie_addr,(socklen_t*)&len);
len -= offsetof(struct sockaddr_un,sun_path);
clie_addr.sun_path[len] = '\0';
printf("bind client file name:%s\n",clie_addr.sun_path);
while((readlen = read(cfd,buf,sizeof (buf))) > 0){
for(int i = 0; i < readlen; i++){
buf[i] = toupper(buf[i]);
}
write(cfd,buf,readlen);
memset(buf,0,sizeof (buf));
}
close(cfd);
}
close(sfd);
return 0;
}
客户端
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <ctype.h>
#include <stddef.h>
#define SERVFILENAME "/home/server.socket"
#define CLIEFILENAME "/home/client.socket"
int main()
{
int cfd = socket(AF_UNIX,SOCK_STREAM,0);
struct sockaddr_un clie_addr;
bzero(&clie_addr,sizeof (clie_addr));
strcpy(clie_addr.sun_path,CLIEFILENAME);
clie_addr.sun_family = AF_UNIX;
int len = offsetof(struct sockaddr_un,sun_path) + strlen(clie_addr.sun_path);
unlink(CLIEFILENAME);
bind(cfd,(struct sockaddr*)&clie_addr,len);
struct sockaddr_un serv_addr;
bzero(&serv_addr,sizeof (serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,SERVFILENAME);
len = offsetof(struct sockaddr_un,sun_path) + strlen(serv_addr.sun_path);
connect(cfd,(struct sockaddr*)&serv_addr,len);
char buf[BUFSIZ];
memset(buf,0,sizeof (buf));
while(fgets(buf,sizeof (buf),stdin) != NULL){
write(cfd,buf,strlen(buf));
memset(buf,0,sizeof (buf));
len = read(cfd,buf,sizeof (buf));
write(STDOUT_FILENO,buf,len);
memset(buf,0,sizeof (buf));
}
close(cfd);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)