Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#include
#include
#include
#include
#include
#include
#include
#include
#include
union fdmsg {
struct cmsghdr h;
char buf[CMSG_SPACE(sizeof(int))];
};
int main(int argc, char** argv) {
int lsock = socket(PF_UNIX, SOCK_STREAM, 0);
if(lsock == -1) {
printf("socket\n");
exit(1);
}
struct sockaddr_un addr;
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "/home/chris/mysock");
int ret = bind(lsock, (struct sockaddr*)&addr, sizeof(addr.sun_family) + strlen(addr.sun_path));
if(ret == -1) {
printf("bind\n");
exit(1);
}
ret = listen(lsock, 5);
if(ret == -1) {
printf("listen\n");
exit(1);
}
struct sockaddr_un other;
socklen_t len = sizeof(struct sockaddr_un);
int csock = accept(lsock, (struct sockaddr*)&other, &len);
if(csock == -1) {
printf("accept\n");
exit(1);
}
int tosend = shm_open("/chris", O_CREAT | O_RDWR, S_IRWXU);
if(tosend == -1) {
printf("file\n");
exit(1);
}
ftruncate(tosend, 10);
char* shm = (char*)mmap(0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, tosend, 0);
if(shm == (char*)-1) {
printf("mmap\n");
exit(1);
}
printf("Got shared memory at %p\n", shm);
strcpy(shm, "SHM!");
shm[4] = '\0';
struct iovec iov;
struct msghdr msg;
char data = 'm';
union fdmsg cmsg;
struct cmsghdr* h;
msg.msg_control = cmsg.buf;
msg.msg_controllen = sizeof(union fdmsg);
msg.msg_name = 0;
msg.msg_namelen = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_flags = 0;
iov.iov_base = &data;
iov.iov_len = 1;
h = CMSG_FIRSTHDR(&msg);
h->cmsg_len = CMSG_LEN(sizeof(int));
h->cmsg_level = SOL_SOCKET;
h->cmsg_type = SCM_RIGHTS;
*((int*)CMSG_DATA(h)) = tosend;
ret = sendmsg(csock, &msg, 0);
if(ret == -1) {
printf("sendmsg\n");
exit(1);
}
shm_unlink("/chris");
while(1) {
printf("SHM: %s; press a key to increment first byte of shm\n", shm);
getchar();
shm[0]++;
msync(shm, 10, 0);
}
return 0;
}