网络通信
参数: AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信); AF_INET: 基于TCP/IPv4(32位IP地址)的网络通信; AF_INET6: 基于TCP/IPv6(128位IP地址)的网络通信; AF_PACKET: 基于底层包接口的网络通信。
type - 通信协议,取值:
SOCK_STREAM: 数据流协议,即TCP协议;
SOCK_DGRAM: 数据报协议,即UDP协议。
protocol - 特别通信协议,一般不用,置0即可。
成功返回套接字描述符,失败返回-1。
本地通信
基于UDP协议的本地通信
服务器
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/un.h>
#include <stdbool.h>
#define SOCK_FILE "/tmp/socket"
int main(){
printf("1.服务器创建socket文件描述符.\n");
int sfd = socket(AF_LOCAL,SOCK_DGRAM,0);
if(sfd == -1){
perror("socket");
return -1;
}
printf("2.准备物理通信地址.\n");
struct sockaddr_un addr;
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path,SOCK_FILE);
socklen_t len = sizeof(addr);
printf("3.socket套接字绑定物理地址.\n");
int ret = bind(sfd,(const struct sockaddr*)&addr,len);
if(ret == -1){
perror("bind");
return -1;
}
char buf[1024] = {};
while(true){
ret = read(sfd,buf,1024);
if(ret == -1){
perror("read");
break;
}
printf("recv: %s",buf);
if(strcmp(buf,"!quit\n")==0){
break;
}
}
close(sfd);
unlink(SOCK_FILE);
return 0;
}
客户端
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/un.h>
#include <stdbool.h>
#define SOCK_FILE "/tmp/socket"
int main(){
printf("1.客户端创建socket文件描述符.\n");
int sfd = socket(AF_LOCAL,SOCK_DGRAM,0);
if(sfd == -1){
perror("socket");
return -1;
}
printf("2.准备物理通信地址.\n");
struct sockaddr_un addr;
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path,SOCK_FILE);
socklen_t len = sizeof(addr);
printf("3.socket套接字绑定物理地址.\n");
int ret = connect(sfd,(const struct sockaddr*)&addr,len);
if(ret == -1){
perror("connect");
return -1;
}
char buf[1024] = {};
while(true){
printf(">");
fgets(buf,1024,stdin);
ret = write(sfd,buf,strlen(buf)+1);
if(ret == -1){
perror("write");
break;
}
if(strcmp(buf,"!quit\n")==0){
break;
}
}
close(sfd);
return 0;
}
基于TCP协议的本地通信
服务器
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdbool.h>
#define SOCK_FILE "/tmp/socket"
int main(){
unlink(SOCK_FILE);
printf("1.服务器创建socket文件描述符.\n");
int sfd = socket(AF_UNIX,SOCK_STREAM,0);
if(sfd == -1){
perror("socket");
return -1;
}
printf("2.准备物理通信地址.\n");
struct sockaddr_un addr = {};
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path,SOCK_FILE);
socklen_t len = sizeof(addr);
printf("3.socket套接字绑定到物理地址.\n");
int ret = bind(sfd,(struct sockaddr*)&addr,len);
if(ret == -1){
perror("bind");
return -1;
}
printf("4.监听.\n");
listen(sfd,3);
printf("5.等待客户端连接上来.\n");
int cfd = accept(sfd,NULL,NULL);
if(cfd == -1){
perror("accept");
return -1;
}
printf("6.有客户端连接上来.\n");
char buf[1024]={};
pid_t id = fork();
if(id == -1){
perror("fork");
return -1;
}
while(true){
if(id == 0){
ret = read(cfd,buf,1024);
if(ret == -1||ret == 0){
perror("read");
break;
}
printf("recv:%s>",buf);
}else{
printf(">");
fgets(buf,1024,stdin);
ret = write(cfd,buf,strlen(buf)+1);
if(ret == -1||ret==0){
perror("write");
break;
}
}
}
close(cfd);
close(sfd);
unlink(SOCK_FILE);
return 0;
}
客户端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdbool.h>
#define SOCK_FILE "/tmp/socket"
int main(){
printf("1.客户创建socket文件描述符.\n");
int sfd = socket(AF_UNIX,SOCK_STREAM,0);
if(sfd == -1){
perror("socket");
return -1;
}
printf("2.准备连接到哪个物理通信地址.\n");
struct sockaddr_un addr = {};
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path,SOCK_FILE);
socklen_t len = sizeof(addr);
printf("3.连接服务器.\n");
int ret = connect(sfd,(struct sockaddr*)&addr,len);
if(ret == -1){
perror("bind");
return -1;
}
char buf[1024]={};
pid_t id = fork();
if(id == -1){
perror("fork");
return -1;
}
while(true){
if(id == 0){
printf(">");
fgets(buf,1024,stdin);
ret = write(sfd,buf,strlen(buf)+1);
if(ret == -1||ret==0){
perror("write");
break;
}
}else{
ret = read(sfd,buf,1024);
if(ret == -1||ret==0){
perror("read");
break;
}
printf("recv:%s>",buf);
}
}
close(sfd);
return 0;
}
|