- 论坛徽章:
- 0
|
本来打算是初始化一个队列,然后开两个进程,一个接收请求并把接收结果入队列,另外一个是出队列的,但是不知道为什么总出队列进程一直打印队列是空的。队列的程序没有错的,我测试过了很多遍了。请各位帮帮忙吧。
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "queue.h"
- #define BACKLOG 1024
- static queue *global_queue = NULL;//队列全局变量
- void server(int argc, char **argv);
- void working();
- void destroy(void *arg) {
- free(arg);
- }
- /* recv: "id:domain" */
- void *proccess(void *arg) {
- int fd = *(int *)arg;
- char buffer[1024];
- ssize_t readsize;
- char *entry;
-
- readsize = recv(fd, buffer, 1024, MSG_DONTWAIT);
-
- queue_entry(global_queue, strdup(buffer)); //入队列
- send(fd, "OK", strlen("OK"), MSG_DONTWAIT);
- close(fd);
-
- pthread_exit(NULL);
- }
- int main(int argc, char **argv) {
- global_queue = queue_init();//初始化队列
- pid_t pid;
-
- pid = fork();
- if (pid == 0) {
- server(argc, argv);
- } else if (pid > 0) {
- working();
- } else {
- printf("Can not fork.\n");
- }
-
- return 0;
- }
- void server(int argc, char **argv) {
- int serverfd, clientfd;
- struct sockaddr_in server_addr;
- struct sockaddr_in client_addr;
- int err;
- pthread_t pid;
- int port;
-
- if (argc != 3) {
- fprintf(stderr, "Error: server <ip> <port>.\n");
- return;
- }
-
- port = atoi(argv[2]);
-
- if (global_queue == NULL) {
- fprintf(stderr, "Can not create queue.\n");
- return;
- }
-
- serverfd = socket(AF_INET, SOCK_STREAM, 0);
- if (serverfd < 0) {
- fprintf(stderr, "Can not open socket.\n");
- return;
- }
-
- bzero(&server_addr, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = inet_addr(argv[1]);
- server_addr.sin_port = htons(port);
-
- err = bind(serverfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
- if (err < 0) {
- fprintf(stderr, "Can not bind socket.\n");
- return;
- }
-
- err = listen(serverfd, BACKLOG);
- if (err < 0) {
- fprintf(stderr, "Can not listen socket.\n");
- return;
- }
-
- for (;;) {
- int addrlen = sizeof(struct sockaddr);
-
- clientfd = accept(serverfd, (struct sockaddr *)&client_addr, &addrlen);
- if (clientfd < 0) {
- printf("Can not accept socket.\n");
- continue;
- }
-
- err = pthread_create(&pid, NULL, proccess, &clientfd);
- if (err < 0) {
- printf("Can not create pthread.\n");
- close(clientfd);
- }
- }
-
- queue_destroy(global_queue, destroy);
- }
- void working() {
- char *entry;
- for (;;) {
- if (!queue_empty(global_queue)) {//如果队列不为空
- entry = (char *)queue_front(global_queue);//出队列
-
- printf("%s\n", entry);
- }
- sleep(2);
- }
-
- return;
- }
复制代码 |
|