檢視socker指令
netstat -an | grep "xx"
unix_socket_service.c
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#define MAXLINE 80
char *socket_path = "server-socket";
int main()
{
struct sockaddr_un serun, cliun;
socklen_t cliun_len;
int listenfd, connfd, size;
char buf[MAXLINE];
int i, n;
if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("socket error");
exit(1);
}
memset(&serun, 0, sizeof(serun));
//本地socket
serun.sun_family = AF_UNIX;
strncpy(serun.sun_path, socket_path, sizeof(serun.sun_path) - 1);
//這個相當于把之前的位址要移除,不然上一個server沒有結束,移除會報錯already in use
unlink(socket_path);
if (bind(listenfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0) {
perror("bind error");
exit(1);
}
printf("UNIX domain socket bound\n");
if (listen(listenfd, 20) < 0) {
perror("listen error");
exit(1);
}
printf("Accepting connections ...\n");
while(1) {
cliun_len = sizeof(cliun);
//判斷是否有新的連結
if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){
perror("accept error");
continue;
}
printf("new client connect to server,client sockaddr === %s \n",((struct sockaddr *)&cliun)->sa_data);
while(1) {
memset(buf, 0, sizeof(buf));
n = read(connfd, buf, sizeof(buf));
if (n < 0) {
perror("read error");
break;
} else if(n == 0) {
printf("EOF\n");
break;
}
printf("received: %s\n", buf);
if(strncmp(buf,"exit",4) == 0) {
printf("client disconnect \n");
break;
}
for(i = 0; i < n; i++) {
buf[i] = toupper(buf[i]);
}
write(connfd, buf, n);
}
//關閉目前連結
close(connfd);
}
close(listenfd);
return 0;
}
unix_socket_client.c
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define MAXLINE 80
char *client_path = "client-socket";
char *server_path = "server-socket";
int main() {
struct sockaddr_un cliun, serun;
int len;
char buf[100];
int sockfd, n;
if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("client socket error");
exit(1);
}
memset(&serun, 0, sizeof(serun));
//本地socket
serun.sun_family = AF_UNIX;
strncpy(serun.sun_path,server_path ,
sizeof(serun.sun_path) - 1);
//連結
if (connect(sockfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0){
perror("connect error");
exit(1);
}
printf("please input send char:");
while(fgets(buf, MAXLINE, stdin) != NULL) {
write(sockfd, buf, strlen(buf));
n = read(sockfd, buf, MAXLINE);
if (n < 0) {
printf("the other side has been closed.\n");
} else if(n==0) {
printf("exit.\n");
break;
} else {
printf("received from server: %s \n",buf);
}
printf("please input send char:");
}
close(sockfd);
return 0;
}
接下來在linux中可以用 gcc指令對其編譯
gcc unix_socket_service.c -o unix_socket_service
gcc unix_socket_client.c -o unix_socket_client
編譯成功後可以運作
關于unix_socket的背景這裡放一篇連結
Android Framework實戰開發視訊--跨程序通信之Socket通信_learnframework的部落格-CSDN部落格
放兩篇吧 第二篇是ip的socket
Android Framework實戰開發視訊--跨程序通信之Socket通信_learnframework的部落格-CSDN部落格
本文代碼也是基于本篇提供的基本代碼編寫的
epoll的寫法參考這篇
Android Framework實戰開發-跨程序通信之 epoll詳細講解_learnframework的部落格-CSDN部落格