int main() { int sock; if((sock = socket(AF_INET, SOCK_STREAM, 0))<0) ERR_EXIT("socket"); int reuse = 1; if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))< 0) ERR_EXIT("setsockopt"); struct sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(5188); if(bind(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr))<0) ERR_EXIT("bind"); if(listen(sock,10)<0) ERR_EXIT("listen"); while(1) { struct sockaddr_in cliaddr; memset(&cliaddr, 0, sizeof(cliaddr)); socklen_t len=0; int c = accept(sock, (struct sockaddr*)&cliaddr, &len); if(c <= 0) continue; int pid = fork(); if(pid < 0) ERR_EXIT("fork"); else if(pid == 0) { echo_ser(c); return -1; } close(c); } }
int main(int argc, char *argv[]) { int msgid; msgid = msgget(1234, IPC_CREAT | 0666); if (msgid == -1) ERR_EXIT("msgget"); echo_ser(msgid); return 0; }
/* unix domain socket与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。*/ int main(void) { int listenfd; if ((listenfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) ERR_EXIT("socket error"); unlink("/tmp/test socket"); //地址复用 struct sockaddr_un servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sun_family = AF_UNIX; strcpy(servaddr.sun_path, "/tmp/test socket"); if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) ERR_EXIT("bind error"); if (listen(listenfd, SOMAXCONN) < 0) ERR_EXIT("listen error"); int conn; pid_t pid; while (1) { conn = accept(listenfd, NULL, NULL); if (conn == -1) { if (conn == EINTR) continue; ERR_EXIT("accept error"); } pid = fork(); if (pid == -1) ERR_EXIT("fork error"); if (pid == 0) { close(listenfd); echo_ser(conn); exit(EXIT_SUCCESS); } close(conn); } return 0; }
int main(void) { int sock; if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) ERR_EXIT("socket error"); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) ERR_EXIT("bind error"); echo_ser(sock); return 0; }