简介
Socket原本是被应用于双机通信,之后引入了Unix Domain Socket。该Socket应用于本机的进程之间,由于其去掉了复杂的协议处理过程,效率会高普通Socket。其用法与普通Socket基本相同。也需要经历socket,bind,listen,connect,read,write,close等阶段。
示例:
/*
* =====================================================================================
*
* Filename: uds_server_ipc.c
*
* Description: IPC using UDS for server
*
* Version: 1.0
* Created: 2012年02月22日 10时43分40秒
* Revision: none
* Compiler: gcc
*
* Author: chn89, chn89@126.com
* Organization:
*
* =====================================================================================
*/
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
struct sockaddr_un server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path,"./connetion");
int len = sizeof(server_addr.sun_family)+strlen(server_addr.sun_path);
unlink("./connetion");
int server_socket = socket(PF_UNIX, SOCK_STREAM, 0);
if (server_socket < 0) {
printf("Create Socket Failed!");
exit(1);
}
/*没整明白,为什么一定有下面这段,不然bind会出错,请明白的指教*/
{
int opt = 1;
setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
}
if (bind(server_socket, (struct sockaddr *)&server_addr,len)) {
printf("Server Bind Failed!");
exit(1);
}
if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) {
printf("Server Listen Failed!");
exit(1);
}
while (1) //一直运行
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int new_server_socket = accept(server_socket, (struct sockaddr *)&client_addr, &length);
if (new_server_socket < 0) {
printf("Server Accept Failed!\n");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
length = recv(new_server_socket, buffer, BUFFER_SIZE, 0);
if (length < 0) {
printf("Server Recieve Data Failed!\n");
break;
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, FILE_NAME_MAX_SIZE + 1);
strncpy(file_name, buffer,strlen(buffer) >
FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE :strlen(buffer));
printf("%s\n", file_name);
FILE *fp = fopen(file_name, "r");
if (NULL == fp) {
printf("File:\t%s Not Found\n", file_name);
} else {
bzero(buffer, BUFFER_SIZE);
int file_block_length = 0;
while ((file_block_length = fread(buffer, sizeof(char), BUFFER_SIZE,fp)) > 0) {
printf("file_block_length = %d\n",file_block_length);
if (send(new_server_socket, buffer,file_block_length, 0) < 0) {
printf("Send File:\t%s Failed\n",file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
fclose(fp);
printf("File:\t%s Transfer Finished\n", file_name);
}
close(new_server_socket);
}
close(server_socket);
return 0;
}/*
* =====================================================================================
*
* Filename: uds_client_ipc.c
*
* Description: IPC using UDS for client
*
* Version: 1.0
* Created: 2012年02月23日 10时43分40秒
* Revision: none
* Compiler: gcc
*
* Author: chn89, chn89@126.com
* Organization:
*
* =====================================================================================
*/
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
struct sockaddr_un client_addr;
bzero(&client_addr, sizeof(client_addr));
client_addr.sun_family = AF_UNIX;
strcpy(client_addr.sun_path,"./connetion");
int len = sizeof(client_addr.sun_family)+strlen(client_addr.sun_path);
int client_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_socket < 0) {
printf("Create Socket Failed!\n");
exit(1);
}
{
int opt = 1;
setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
}
if (connect(client_socket, (struct sockaddr *)&client_addr,len) < 0) {
printf("Can Not Connect To %s!\n", argv[1]);
exit(1);
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name, FILE_NAME_MAX_SIZE + 1);
printf("Please Input File Name On Server:\t");
scanf("%s", file_name);
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strncpy(buffer, file_name,strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));
send(client_socket, buffer, BUFFER_SIZE, 0);
FILE *fp = fopen("new", "w");
if (NULL == fp) {
printf("File:\t%s Can Not Open To Write\n", file_name);
exit(1);
}
bzero(buffer, BUFFER_SIZE);
int length = 0;
while (length = recv(client_socket, buffer, BUFFER_SIZE, 0)) {
if (length < 0) {
printf("Recieve Data From Server Failed!\n");
break;
}
int write_length = fwrite(buffer, sizeof(char), length, fp);
if (write_length < length) {
printf("File:\t%s Write Failed\n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
printf("Recieve File:\t %s Finished\n", file_name);
close(fp);
close(client_socket);
return 0;
}
本文介绍了Unix Domain Socket (UDS),一种用于本机进程间高效通信的方式。它免去了双机通信中的协议处理,用法类似普通Socket,包括socket、bind、listen、connect、read、write和close等步骤。
4824

被折叠的 条评论
为什么被折叠?



