您的位置:首页 > 其它

基于数据流的原始套接字

2012-11-12 13:35 232 查看
服务器端代码:
#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
;
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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: