基于数据流的原始套接字

服务器端代码:
#include <stdlib.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define  SA struct sockaddr
#define N 64

int main(int argc, char *argv[])
{
 int listenfd, connfd, nbyte;
 socklen_t addr_len;
 char buf[N];
 struct sockaddr_un myaddr, peeraddr;
 if (argc < 2)
 {
  printf("input format is: %s  <socket_file>", argv[0]);
  exit(1);
 }
 //int socket(int domain, int type, int protocol);
 if ((listenfd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
 {
  perror("socket fail");
  exit(1);
 }
 unlink(argv[1]);
    // int bind(int sockfd, const struct sockaddr *addr,
 //     socklen_t addrlen);
 bzero(&myaddr, sizeof(myaddr));
 myaddr.sun_family = PF_UNIX;
 strcpy(myaddr.sun_path, argv[1]);
 if (bind(listenfd, (SA *)&myaddr, sizeof(myaddr)) == -1)
 {
  perror("bind fail");
  exit(1);
 }
    // int listen(int sockfd, int backlog);
 if (listen(listenfd, 5) == -1)
 {
  perror("listen fail");
  exit(1);
 }
 //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    addr_len = sizeof(peeraddr);
 if ((connfd = accept(listenfd, (SA *)&peeraddr, &addr_len)) == -1)
 {
  perror("accept fail");
  exit(1);
 }
 //printf("the client is %s:%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(cli_addr.sin_port));
 if ((nbyte = recv(connfd, buf, N, 0)) == -1)
 {
  perror("read fail\n");
  exit(1);
 }
 
 printf("recv from %s : %s", peeraddr.sun_path, buf);
 close(connfd);
 
 return 0;
}

 

客户端代码:


#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

#define N 64
#define  SA struct sockaddr

int main(int argc, char *argv[])
{
 int connfd;
 char buf[N];
 struct sockaddr_un ser_addr;

 if (argc < 2)
 {
  printf("input format is:%s  <server_socket_file>\n", argv[0]);
  exit(1);
 }
 
       //int connect(int sockfd, const struct sockaddr *serv_addr,
       //           socklen_t addrlen);
 bzero(&ser_addr, sizeof(ser_addr));
 ser_addr.sun_family = PF_UNIX;
 strcpy(ser_addr.sun_path, argv[1]);

 if ((connfd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
 {
  perror("socket fail\n");
  exit(1);
 }

 if (connect(connfd, (SA *)&ser_addr, sizeof(ser_addr)) == -1)
 {
  perror("connect fail");
  exit(1);
 }

 strcpy(buf, "this is unix stream socket\n");
 send(connfd, buf, N, 0);

 return 0;
}
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值