伺服器端需要綁定端口,用戶端也需要綁定端口。
s_sock.c
#include <stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#define SERVER_ADDRESS "/tmp/SERVER_ADDRESS"
//#define CLIENT_ADDRESS "/tmp/CLIENT_ADDRESS"
int main(void)
{
int socket_fd;
int ret;
char recv_buf[1024];
char send_buf[1024];
int len = sizeof(struct sockaddr_un);
struct sockaddr_un client_addr;
struct sockaddr_un server_addr;
//1.建立socket連接配接
socket_fd=socket(AF_UNIX,SOCK_DGRAM,0);
if(socket_fd<0)
{
perror("cannot create communication socket");
return 1;
}
unlink(SERVER_ADDRESS);
//2.設定伺服器參數
memset(&server_addr,0,sizeof(server_addr));
server_addr.sun_family=AF_UNIX;
strncpy(server_addr.sun_path,SERVER_ADDRESS,sizeof(server_addr.sun_path)-1);
//3.綁定伺服器位址
ret=bind(socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(ret==-1)
{
perror("cannot bind server socket");
close(socket_fd);
unlink(SERVER_ADDRESS);
return 1;
}
while(1)
{
//4.接受消息
int num = recvfrom(socket_fd,recv_buf,sizeof(recv_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,&len);
if(num>0)
{
printf("rcvfrom:%s\n",recv_buf);
//5。發送消息
memset(send_buf,0,sizeof(send_buf));
strcpy(send_buf,"message from server");
ret = sendto(socket_fd,send_buf,sizeof(send_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,len);
if(ret < 0)
{
printf("send failed ! error message : %s\n",strerror(errno));
}
else
{
printf("sendto success\n");
}
}
else
{
printf("\n");
}
}
close(socket_fd);
unlink(SERVER_ADDRESS);
return 0;
}
c_socket.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#define SERVER_ADDRESS "/tmp/SERVER_ADDRESS"
#define CLIENT_ADDRESS "/tmp/CLIENT_ADDRESS"
int main(void)
{
int ret=-1;
int socket_fd;
char send_buf[1024];
char recv_buf[1024];
char clientSock[256];
int len = sizeof(struct sockaddr_un);
struct sockaddr_un server_addr;
struct sockaddr_un client_addr;
//1.建立socket連接配接
socket_fd=socket(AF_UNIX,SOCK_DGRAM,0);
if(socket_fd<0)
{
perror("cannot create communication socket");
return 1;
}
sprintf(clientSock,"/tmp/CLIENT_ADDRESS_%d",socket_fd);
unlink(clientSock); //防止之前線程建立相同socket檔案後,退出未關閉socket。
//2.設定伺服器
server_addr.sun_family=AF_UNIX;
strncpy(server_addr.sun_path,clientSock,sizeof(server_addr.sun_path)-1);
//3.綁定伺服器位址
ret=bind(socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr)); //産生socket檔案
if(ret==-1)
{
perror("cannot bind server socket");
unlink(clientSock);
close(socket_fd);
return 1;
}
//設定發送資料
memset(send_buf,0,1024);
strcpy(send_buf,"message from client");
memset(&client_addr,0,sizeof(client_addr));
client_addr.sun_family=AF_UNIX;
strncpy(client_addr.sun_path,SERVER_ADDRESS,sizeof(client_addr.sun_path)-1);
//發送資料
ret = sendto(socket_fd,send_buf,sizeof(send_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,len);
if(ret>0)
{
printf("send success\n");
}
else
{
printf("send failed ! error message : %s\n",strerror(errno));
}
sleep(6);
//接受資料
memset(recv_buf,0,sizeof(recv_buf));
ret = recvfrom(socket_fd,recv_buf,sizeof(recv_buf),MSG_DONTWAIT,(struct sockaddr *)&server_addr,&len);
if(ret>0)
{
printf("recv success :%s\n",recv_buf);
}
else
{
printf("recv err\n");
}
//關閉socket
unlink(clientSock);
close(socket_fd);
return 0;
}