您的位置:首页 > 其它

基于数据包的原始套接字

2012-11-12 14:04 225 查看
服务器端代码:

#include <stdlib.h>

#include <string.h>

#include <sys/un.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/types.h>

#define N 64

typedef struct sockaddr SA;

int main(int argc, char *argv[])

{

int sockfd;

socklen_t addr_len;

char buf
;

struct sockaddr_un myaddr, peeraddr;

if (argc < 2)

{

printf("input format is : %s <server_socket_file>\n", argv[0]);

return -1;

}

if ((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) == -1)

{

perror("sock fail");

return -1;

}

unlink(argv[1]);

bzero(&myaddr, sizeof(myaddr));

myaddr.sun_family = PF_UNIX;

strcpy(myaddr.sun_path, argv[1]);

if (bind(sockfd, (SA *)&myaddr, sizeof(myaddr)) == -1)

{

perror("bind fail");

return -1;

}

addr_len = sizeof(peeraddr);

recvfrom(sockfd, buf, N, 0, (SA *)&peeraddr, &addr_len);

printf("recv from %s : %s\n",peeraddr.sun_path, buf);

sendto(sockfd, buf, N, 0, (SA *)&peeraddr, addr_len);

return 0;

}

客户端代码如下:

#include <stdlib.h>

#include <string.h>

#include <sys/un.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/types.h>

#define N 64

typedef struct sockaddr SA;

int main(int argc, char *argv[])

{

int sockfd;

socklen_t addr_len;

char buf
;

struct sockaddr_un peeraddr, myaddr;

if (argc < 3)

{

printf("input format is : %s <server_sock_file> <my_sock_file>\n", argv[0]);

return -1;

}

if ((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) == -1)

{

perror("sock fail");

return -1;

}

// bind myaddr

unlink(argv[2]);

bzero(&myaddr, sizeof(myaddr));

myaddr.sun_family = PF_UNIX;

strcpy(myaddr.sun_path, argv[2]);

if (bind(sockfd, (SA *)&myaddr, sizeof(myaddr)) == -1)

{

perror("bind fail");

return -1;

}

bzero(&peeraddr, sizeof(peeraddr));

peeraddr.sun_family = PF_UNIX;

strcpy(peeraddr.sun_path, argv[1]);

strcpy(buf, "this is unix dgram socket\n");

addr_len = sizeof(peeraddr);

sendto(sockfd, buf, N, 0, (SA *)&peeraddr, addr_len);

recvfrom(sockfd, buf, N, 0, (SA *)&peeraddr, &addr_len);

printf("recv from %s : %s\n", peeraddr.sun_path, buf);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: